http://jira.mfd.msk:8088/browse/CLS-358 (report builders)
This commit is contained in:
parent
7f9d8badec
commit
717e861fe0
43 changed files with 1710 additions and 71 deletions
|
|
@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean;
|
|||
import org.springframework.context.annotation.Configuration;
|
||||
import ru.spcex.clearing.reports.reports.*;
|
||||
import ru.spcex.clearing.reports.reports.bp.*;
|
||||
import ru.spcex.clearing.reports.reports.ks.*;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
||||
|
|
@ -18,6 +19,12 @@ public class ReportBuildersConfig {
|
|||
Map<ReportType, List<CSVReportBuilder<EmptyParams>>> resultMap = new HashMap<>();
|
||||
resultMap.put(ReportType.SUMMARY_LIABILITIES_CLAIMS, List.of(new SummaryLiabilitiesClaimsReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.SUMMARY_MONEY_CHANGE, List.of(new SummaryMoneyChangeReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_CASH_REGISTERS, List.of(new KSRepCashRegistersReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_CASH_REGISTER_SUMS, List.of(new KSRepCashRegisterSumsReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_DEPO_REGISTERS, List.of(new KSRepDepoRegistersReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(new KSRepDepoRegisterQuantitiesReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_TRADES, List.of(new KSRepTradesReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_FIRM_DETAILS, List.of(new KSRepFirmDetailsReportBuilder(imdgProvider)));
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
|
|
@ -35,6 +42,8 @@ public class ReportBuildersConfig {
|
|||
)
|
||||
);
|
||||
resultMap.put(ReportType.UNFULFILLED_DEAL_REPORT, List.of(new UnfulfilledDealReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_CASH_NETTO, List.of(new KSRepCashNettoReportBuilder(imdgProvider)));
|
||||
resultMap.put(ReportType.KS_REP_DEPO_NETTO, List.of(new KSRepDepoNettoReportBuilder(imdgProvider)));
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,13 @@ public class ValidationConfig {
|
|||
ReportRequest::getReportId,
|
||||
new IEnumKey[]{
|
||||
ReportType.SUMMARY_LIABILITIES_CLAIMS,
|
||||
ReportType.SUMMARY_MONEY_CHANGE
|
||||
ReportType.SUMMARY_MONEY_CHANGE,
|
||||
ReportType.KS_REP_CASH_REGISTERS,
|
||||
ReportType.KS_REP_CASH_REGISTER_SUMS,
|
||||
ReportType.KS_REP_DEPO_REGISTERS,
|
||||
ReportType.KS_REP_DEPO_REGISTER_QUANTITIES,
|
||||
ReportType.KS_REP_TRADES,
|
||||
ReportType.KS_REP_FIRM_DETAILS
|
||||
},
|
||||
ReportError.WrongFieldValue,
|
||||
ReportError.RequiredFieldEmpty)
|
||||
|
|
@ -82,7 +88,9 @@ public class ValidationConfig {
|
|||
ReportType.OPERATIONAL_LIABILITIES_CLAIMS,
|
||||
ReportType.OPERATIONAL_MONEY_CHANGE,
|
||||
ReportType.EXECUTED_DEAL_REPORT,
|
||||
ReportType.UNFULFILLED_DEAL_REPORT
|
||||
ReportType.UNFULFILLED_DEAL_REPORT,
|
||||
ReportType.KS_REP_CASH_NETTO,
|
||||
ReportType.KS_REP_DEPO_NETTO,
|
||||
},
|
||||
ReportError.WrongFieldValue,
|
||||
ReportError.RequiredFieldEmpty),
|
||||
|
|
|
|||
|
|
@ -4,12 +4,14 @@ import com.opencsv.CSVWriterBuilder;
|
|||
import com.opencsv.ICSVWriter;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.format.datetime.standard.InstantFormatter;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.text.DecimalFormat;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -21,9 +23,12 @@ import java.util.List;
|
|||
public abstract class CSVReportBuilder<P> {
|
||||
protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class);
|
||||
|
||||
protected DecimalFormat df02Format = new DecimalFormat("#0.00");
|
||||
protected DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
|
||||
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
|
||||
protected DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
|
||||
protected DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
|
||||
protected InstantFormatter instantFormatter = new InstantFormatter();
|
||||
|
||||
/**
|
||||
* Метод получения заголовков для CSV отчета
|
||||
|
|
|
|||
|
|
@ -14,10 +14,7 @@ import java.math.RoundingMode;
|
|||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilder<T> {
|
||||
protected final DateTimeFormatter fileNameDateTimeFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
|
||||
|
|
@ -26,7 +23,7 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
|
|||
private final Imdg<STrades> sTradesImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"id", "securityId", "tradeNo", "tradeDate", "tradeTime",
|
||||
"securityId", "tradeNo", "tradeDate", "tradeTime",
|
||||
"settleDate", "settleCode", "price", "quanity", "value"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
|
@ -58,12 +55,17 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
|
|||
protected void collect(T params) {
|
||||
Collection<ExecutionFond> executionFonds = getExecutionFondsForReport(params);
|
||||
|
||||
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
|
||||
lines = new ArrayList<>(executionFonds.size());
|
||||
long reportRowId = 0L;
|
||||
for (ExecutionFond executionFond : executionFonds) {
|
||||
try {
|
||||
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
|
||||
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
|
||||
Boolean activeCompany = activeCompanyForId.get(executionFond.getCompanyId());
|
||||
if (activeCompany == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
|
||||
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
|
||||
activeCompanyForId.put(executionFond.getCompanyId(), activeCompany);
|
||||
}
|
||||
if (!activeCompany) continue;
|
||||
|
||||
STrades sTrade = null;
|
||||
if (executionFond.getSide() != null && executionFond.getExchangeExecutionId() != null) {
|
||||
|
|
@ -75,8 +77,7 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
|
|||
);
|
||||
}
|
||||
|
||||
String id = String.valueOf(reportRowId++);
|
||||
String securityId = String.valueOf(executionFond.getSecurityId());
|
||||
String securityId = String.valueOf(executionFond.getSecuritySymbol());
|
||||
String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
|
||||
String tradeDate = "";
|
||||
String tradeTime = "";
|
||||
|
|
@ -84,15 +85,15 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
|
|||
if (executionFond.getTradingDate() != null) {
|
||||
tradeDate = dateFormatter.format(executionFond.getTradingDate());
|
||||
}
|
||||
if (executionFond.getCreated() != null) {
|
||||
tradeTime = dateFormatter.format(LocalDate.ofInstant(executionFond.getCreated(), ZoneId.systemDefault()));
|
||||
if (executionFond.getExchangeExecutionTime() != null) {
|
||||
tradeTime = dateFormatter.format(LocalDate.ofInstant(executionFond.getExchangeExecutionTime(), ZoneId.systemDefault()));
|
||||
}
|
||||
if (executionFond.getSettlementDate() != null) {
|
||||
settleDate = dateFormatter.format(executionFond.getSettlementDate());
|
||||
}
|
||||
String settleCode = sTrade != null ? sTrade.getSettleCode() : "";
|
||||
String quantity = String.valueOf(executionFond.getQuantity());
|
||||
String value = String.valueOf(executionFond.getSettlementAmount());
|
||||
String quantity = executionFond.getQuantity() != null ? String.valueOf(executionFond.getQuantity()) : "";
|
||||
String value = executionFond.getSettlementAmount() != null ? String.valueOf(executionFond.getSettlementAmount()) : "";
|
||||
String price = "";
|
||||
if (executionFond.getSettlementAmount() != null && executionFond.getQuantity() != null) {
|
||||
price = String.valueOf(executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP));
|
||||
|
|
@ -100,7 +101,6 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
|
|||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = id;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = tradeNo;
|
||||
line[valueIdx++] = tradeDate;
|
||||
|
|
|
|||
|
|
@ -15,17 +15,14 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
|||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public class UnfulfilledDealReportBuilder 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"
|
||||
"securityId", "tradeNo", "tradeDate", "settleCode"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
|
|
@ -64,32 +61,40 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
|
|||
);
|
||||
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
|
||||
|
||||
long reportRowId = 0L;
|
||||
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
|
||||
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(
|
||||
"settleCode", executionFond.getSettlementCode(),
|
||||
"operation", executionFond.getSide()
|
||||
)
|
||||
);
|
||||
try {
|
||||
Boolean activeCompany = activeCompanyForId.get(executionFond.getCompanyId());
|
||||
if (activeCompany == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
|
||||
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
|
||||
activeCompanyForId.put(executionFond.getCompanyId(), activeCompany);
|
||||
}
|
||||
if (!activeCompany) continue;
|
||||
|
||||
String id = String.valueOf(reportRowId++);
|
||||
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;
|
||||
STrades sTrade = sTradesImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"settleCode", executionFond.getSettlementCode(),
|
||||
"operation", executionFond.getSide()
|
||||
)
|
||||
);
|
||||
|
||||
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);
|
||||
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++] = securityId;
|
||||
line[valueIdx++] = tradeNo;
|
||||
line[valueIdx++] = tradeDate;
|
||||
line[valueIdx++] = settleCode;
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for execution_fond (id = %d), skipped".formatted(executionFond.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,104 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.misc.Session;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.SessionIdParam;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
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;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Session> sessionImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "SESSION_ID", "SESSION_DATE", "ACCOUNT", "VALUE", "DATE"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepCashNettoReportBuilder(ImdgProvider imdgProvider) {
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(SessionIdParam params) {
|
||||
return "KS_REP_CASH_NETTO_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_CASH_NETTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(SessionIdParam params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate finalPredicate = pb.and(
|
||||
pb.equals("sessionId", params.getSessionId()),
|
||||
pb.equals("clearingDate", nowDate),
|
||||
pb.regex("registryCode","[T|O]M.T")
|
||||
);
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
|
||||
|
||||
Map<Long, String> createdAtForSessionId = new HashMap<>();
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
try {
|
||||
|
||||
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
|
||||
String sessionId = String.valueOf(registry.getSessionId());
|
||||
|
||||
String sessionDate = createdAtForSessionId.get(registry.getSessionId());
|
||||
if (sessionDate == null) {
|
||||
Session session = sessionImdg.getSingleObjectByID(registry.getSessionId());
|
||||
sessionDate = session != null && session.getCreated() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : "";
|
||||
createdAtForSessionId.put(registry.getSessionId(), sessionDate);
|
||||
}
|
||||
|
||||
String account = "";
|
||||
if (registry.getAccountType().equalsIgnoreCase(AccountType.Info.getKey()) || registry.getAccountType().equalsIgnoreCase(AccountType.Clrn.getKey()))
|
||||
account = registry.getAccount();
|
||||
|
||||
// todo выяснить, как заполнять
|
||||
String value = registry.getBalance() != null ? df02Format.format(registry.getBalance()) : "";
|
||||
|
||||
String date = dateFormatter.format(nowDate);
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = sessionId;
|
||||
line[valueIdx++] = sessionDate;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = value;
|
||||
line[valueIdx++] = date;
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.EmptyParams;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
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.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "ACCOUNT", "REGISTER_CODE", "ADD_SUM", "ADD_TIME", "ADD_DATE"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) {
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(EmptyParams params) {
|
||||
return "KS_REP_CASH_REGISTER_SUMS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_CASH_REGISTERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(EmptyParams params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
Instant instantNow = Instant.now();
|
||||
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate finalPredicate = pb.and(
|
||||
pb.regex("registryCode", "AM.."),
|
||||
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
|
||||
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS))
|
||||
);
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
|
||||
|
||||
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
try {
|
||||
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
|
||||
if (activeCompany == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
|
||||
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
|
||||
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
|
||||
}
|
||||
if (!activeCompany) continue;
|
||||
|
||||
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
|
||||
|
||||
String account = "";
|
||||
if (registry.getAccountType().equalsIgnoreCase(AccountType.Info.getKey()) || registry.getAccountType().equalsIgnoreCase(AccountType.Clrn.getKey()))
|
||||
account = registry.getAccount();
|
||||
|
||||
String registerCode = registry.getRegistryCode();
|
||||
|
||||
String addSum = "";
|
||||
if (registry.getCredit() != null) addSum = df02Format.format(registry.getCredit());
|
||||
else if (registry.getDebit() != null) addSum = df02Format.format(registry.getDebit());
|
||||
|
||||
String addTime = "";
|
||||
String addDate = dateFormatter.format(nowDate);
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = registerCode;
|
||||
line[valueIdx++] = addSum;
|
||||
line[valueIdx++] = addTime;
|
||||
line[valueIdx++] = addDate;
|
||||
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.EmptyParams;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
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.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParams> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "ACCOUNT", "DATE", "REGISTER_CODE", "REGISTER_NAME", "OPEN_BALANCE", "CHANGE_BALANCE", "ADD_WITHDRAW", "CLOSE_BALANCE", "REMARKS"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepCashRegistersReportBuilder(ImdgProvider imdgProvider) {
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(EmptyParams params) {
|
||||
return "KS_REP_CASH_REGISTERS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_CASH_REGISTERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(EmptyParams params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
Instant instantNow = Instant.now();
|
||||
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate finalPredicate = pb.and(
|
||||
pb.regex("registryCode", "AM.T"),
|
||||
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
|
||||
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS))
|
||||
);
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
|
||||
|
||||
Map<String, String> nameForRegisterCode = new HashMap<>();
|
||||
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
|
||||
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
try {
|
||||
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
|
||||
if (activeCompany == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
|
||||
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
|
||||
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
|
||||
}
|
||||
if (!activeCompany) continue;
|
||||
|
||||
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
|
||||
|
||||
String account = "";
|
||||
if (registry.getAccountType().equalsIgnoreCase(AccountType.Info.getKey()) || registry.getAccountType().equalsIgnoreCase(AccountType.Clrn.getKey()))
|
||||
account = registry.getAccount();
|
||||
|
||||
String date = dateFormatter.format(nowDate);
|
||||
String registerCode = registry.getRegistryCode();
|
||||
|
||||
String registerName = nameForRegisterCode.get(registerCode);
|
||||
if (registerName == null) {
|
||||
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
|
||||
registerName = registryCodeDescription != null && registryCodeDescription.getName() != null ? registryCodeDescription.getName() : "";
|
||||
nameForRegisterCode.put(registerCode, registerName);
|
||||
}
|
||||
|
||||
String openBalance = registry.getOpenBalance() != null ? df02Format.format(registry.getOpenBalance()) : "";
|
||||
|
||||
String changeBalance = "";
|
||||
if (registry.getSettledCredit() != null) {
|
||||
if (registry.getSettledDebit() != null)
|
||||
changeBalance = df02Format.format(registry.getSettledCredit().subtract(registry.getSettledDebit()));
|
||||
else changeBalance = df02Format.format(registry.getSettledCredit());
|
||||
}
|
||||
|
||||
String addWithdraw = "";
|
||||
if (registry.getCredit() != null) {
|
||||
if (registry.getDebit() != null)
|
||||
addWithdraw = df02Format.format(registry.getCredit().subtract(registry.getDebit()));
|
||||
else addWithdraw = df02Format.format(registry.getCredit());
|
||||
}
|
||||
|
||||
String closeBalance = registry.getCloseBalance() != null ? df02Format.format(registry.getCloseBalance()) : "";
|
||||
String remarks = "";
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = date;
|
||||
line[valueIdx++] = registerCode;
|
||||
line[valueIdx++] = registerName;
|
||||
line[valueIdx++] = openBalance;
|
||||
line[valueIdx++] = changeBalance;
|
||||
line[valueIdx++] = addWithdraw;
|
||||
line[valueIdx++] = closeBalance;
|
||||
line[valueIdx++] = remarks;
|
||||
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.misc.Session;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.SessionIdParam;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
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;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Session> sessionImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "SESSION_ID", "SESSION_DATE", "ACCOUNT", "SECURITYID", "VALUE", "DATE"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepDepoNettoReportBuilder(ImdgProvider imdgProvider) {
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(SessionIdParam params) {
|
||||
return "KS_REP_DEPO_NETTO_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_CASH_NETTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(SessionIdParam params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate finalPredicate = pb.and(
|
||||
pb.equals("sessionId", params.getSessionId()),
|
||||
pb.equals("clearingDate", nowDate),
|
||||
pb.regex("registryCode","[T|O]S.T")
|
||||
);
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
|
||||
|
||||
Map<Long, String> createdAtForSessionId = new HashMap<>();
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
try {
|
||||
|
||||
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
|
||||
String sessionId = String.valueOf(registry.getSessionId());
|
||||
|
||||
String sessionDate = createdAtForSessionId.get(registry.getSessionId());
|
||||
if (sessionDate == null) {
|
||||
Session session = sessionImdg.getSingleObjectByID(registry.getSessionId());
|
||||
sessionDate = session != null && session.getCreated() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : "";
|
||||
createdAtForSessionId.put(registry.getSessionId(), sessionDate);
|
||||
}
|
||||
|
||||
String account = "";
|
||||
if (registry.getAccountType().equalsIgnoreCase(AccountType.Depo.getKey())) account = registry.getAccount();
|
||||
|
||||
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
|
||||
|
||||
// todo выяснить, как заполнять
|
||||
String value = registry.getBalance() != null ? df02Format.format(registry.getBalance()) : "";
|
||||
|
||||
String date = dateFormatter.format(nowDate);
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = sessionId;
|
||||
line[valueIdx++] = sessionDate;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = value;
|
||||
line[valueIdx++] = date;
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.EmptyParams;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
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.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "ACCOUNT", "SECURITYID", "REGISTER_CODE", "ADD_QUANTITY", "ADD_TIME", "ADD_DATE"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) {
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(EmptyParams params) {
|
||||
return "KS_REP_DEPO_REGISTER_QUANTITIES_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_DEPO_REGISTER_QUANTITIES;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(EmptyParams params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
Instant instantNow = Instant.now();
|
||||
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate finalPredicate = pb.and(
|
||||
pb.regex("registryCode", "AS.."),
|
||||
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
|
||||
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS))
|
||||
);
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
|
||||
|
||||
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
|
||||
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
try {
|
||||
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
|
||||
if (activeCompany == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
|
||||
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
|
||||
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
|
||||
}
|
||||
if (!activeCompany) continue;
|
||||
|
||||
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
|
||||
|
||||
String account = "";
|
||||
if (registry.getAccountType().equalsIgnoreCase(AccountType.Depo.getKey()))
|
||||
account = registry.getAccount();
|
||||
|
||||
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
|
||||
String registerCode = registry.getRegistryCode();
|
||||
|
||||
String addQuantity = "";
|
||||
if (registry.getCredit() != null) addQuantity = df02Format.format(registry.getCredit());
|
||||
else if (registry.getDebit() != null) addQuantity = df02Format.format(registry.getDebit());
|
||||
|
||||
String addTime = "";
|
||||
String addDate = dateFormatter.format(nowDate);
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = registerCode;
|
||||
line[valueIdx++] = addQuantity;
|
||||
line[valueIdx++] = addTime;
|
||||
line[valueIdx++] = addDate;
|
||||
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,141 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.EmptyParams;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
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.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParams> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "ACCOUNT", "DATE", "SECURITYID", "REGISTER_CODE", "REGISTER_NAME", "OPEN_QUANTITY", "CHANGE_QUANTITY", "ADD_WITHDRAW_DEPO", "CLOSE_QUANTITY", "REMARKS"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepDepoRegistersReportBuilder(ImdgProvider imdgProvider) {
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(EmptyParams params) {
|
||||
return "KS_REP_DEPO_REGISTERS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_CASH_REGISTERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(EmptyParams params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
Instant instantNow = Instant.now();
|
||||
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate finalPredicate = pb.and(
|
||||
pb.regex("registryCode", "AS.T"),
|
||||
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
|
||||
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS))
|
||||
);
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
|
||||
|
||||
Map<String, String> nameForRegisterCode = new HashMap<>();
|
||||
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
|
||||
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
try {
|
||||
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
|
||||
if (activeCompany == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
|
||||
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
|
||||
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
|
||||
}
|
||||
if (!activeCompany) continue;
|
||||
|
||||
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
|
||||
|
||||
String account = "";
|
||||
if (registry.getAccountType().equalsIgnoreCase(AccountType.Depo.getKey())) account = registry.getAccount();
|
||||
|
||||
String date = dateFormatter.format(nowDate);
|
||||
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
|
||||
String registerCode = registry.getRegistryCode();
|
||||
|
||||
String registerName = nameForRegisterCode.get(registerCode);
|
||||
if (registerName == null) {
|
||||
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
|
||||
registerName = registryCodeDescription != null && registryCodeDescription.getName() != null ? registryCodeDescription.getName() : "";
|
||||
nameForRegisterCode.put(registerCode, registerName);
|
||||
}
|
||||
|
||||
String openQuantity = registry.getOpenBalance() != null ? registry.getOpenBalance().toString() : "";
|
||||
|
||||
String changeQuantity = "";
|
||||
if (registry.getSettledCredit() != null) {
|
||||
if (registry.getSettledDebit() != null)
|
||||
changeQuantity = registry.getSettledCredit().subtract(registry.getSettledDebit()).toString();
|
||||
else changeQuantity = registry.getSettledCredit().toString();
|
||||
}
|
||||
|
||||
String addWithdrawDepo = "";
|
||||
if (registry.getCredit() != null) {
|
||||
if (registry.getDebit() != null)
|
||||
addWithdrawDepo = registry.getCredit().subtract(registry.getDebit()).toString();
|
||||
else addWithdrawDepo = registry.getCredit().toString();
|
||||
}
|
||||
|
||||
String closeQuantity = registry.getCloseBalance() != null ? registry.getCloseBalance().toString() : "";
|
||||
String remarks = "";
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = date;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = registerCode;
|
||||
line[valueIdx++] = registerName;
|
||||
line[valueIdx++] = openQuantity;
|
||||
line[valueIdx++] = changeQuantity;
|
||||
line[valueIdx++] = addWithdrawDepo;
|
||||
line[valueIdx++] = closeQuantity;
|
||||
line[valueIdx++] = remarks;
|
||||
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||
import ru.clearing.classes.statics.data.profile.ProfileDocument;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.EmptyParams;
|
||||
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||
import ru.spcex.platform.enumeration.DocumentTypes;
|
||||
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 java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams> {
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<CompanySymbols> companySymbolsImdg;
|
||||
private final Imdg<ProfileDocument> profileDocumentImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"FIRMID", "PART_INN", "PART_KPP", "AGREEMENT_NUMBER", "AGREEMENT_DATE", "AGREEMENT_NAME", "FIRM_NAME"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepFirmDetailsReportBuilder(ImdgProvider imdgProvider) {
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(EmptyParams params) {
|
||||
return "KS_REP_FIRM_DETAILS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_FIRM_DETAILS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(EmptyParams params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
Instant instantNow = Instant.now();
|
||||
|
||||
Collection<Company> companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey()));
|
||||
|
||||
lines = new ArrayList<>(companies.size());
|
||||
for (Company company : companies) {
|
||||
try {
|
||||
String firmId = company.getTradingCode() != null ? company.getTradingCode() : "";
|
||||
|
||||
CompanySymbols innCompanySymbol = companySymbolsImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"companyId", company.getId(),
|
||||
"companySymbol", CompanySymbol.INN.getKey()
|
||||
)
|
||||
);
|
||||
String partInn = innCompanySymbol != null && innCompanySymbol.getCompanySymbolValue() != null ? innCompanySymbol.getCompanySymbolValue() : "";
|
||||
|
||||
CompanySymbols cppCompanySymbol = companySymbolsImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"companyId", company.getId(),
|
||||
"companySymbol", CompanySymbol.CPP.getKey()
|
||||
)
|
||||
);
|
||||
String partKpp = cppCompanySymbol != null && cppCompanySymbol.getCompanySymbolValue() != null ? cppCompanySymbol.getCompanySymbolValue() : "";
|
||||
|
||||
ProfileDocument profileDocument = profileDocumentImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"companyId", company.getId(),
|
||||
"documentType", DocumentTypes.cntr.getKey()
|
||||
)
|
||||
);
|
||||
String agreementNumber = "";
|
||||
String agreementDate = "";
|
||||
String agreementName = "";
|
||||
if (profileDocument != null) {
|
||||
agreementNumber = profileDocument.getNumber() != null ? profileDocument.getNumber() : "";
|
||||
agreementDate = profileDocument.getIssueDate() != null ? dateFormatter.format(profileDocument.getIssueDate()) : "";
|
||||
agreementName = profileDocument.getName() != null ? profileDocument.getName() : "";
|
||||
}
|
||||
|
||||
String firmName = company.getFullName() != null ? company.getFullName() : "";
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = partInn;
|
||||
line[valueIdx++] = partKpp;
|
||||
line[valueIdx++] = agreementNumber;
|
||||
line[valueIdx++] = agreementDate;
|
||||
line[valueIdx++] = agreementName;
|
||||
line[valueIdx++] = firmName;
|
||||
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for company (id = %d), skipped".formatted(company.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
package ru.spcex.clearing.reports.reports.ks;
|
||||
|
||||
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.misc.Session;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.EmptyParams;
|
||||
import ru.spcex.platform.enumeration.CoverageStatus;
|
||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
|
||||
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
|
||||
private final Imdg<ExecutionDeposit> executionDepositImdg;
|
||||
private final Imdg<ExecutionFond> executionFondImdg;
|
||||
private final Imdg<Session> sessionImdg;
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"SESSION_ID", "SESSION_DATE", "TR_ID", "FIRM_ID", "TKR", "CASH_LIABILITY", "DEPO_LIABILITY", "TRADE_NUM", "CLASS_CODE", "TRADE_DATE", "STATUS"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public KSRepTradesReportBuilder(ImdgProvider imdgProvider) {
|
||||
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
|
||||
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(EmptyParams params) {
|
||||
return "KS_REP_TRADES_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReportType getReportType() {
|
||||
return ReportType.KS_REP_TRADES;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(EmptyParams params) {
|
||||
LocalDate nowDate = LocalDate.now();
|
||||
|
||||
ImdgPredicateBuilder pbExecutionDeposit = executionDepositImdg.predicateBuilder();
|
||||
Collection<ExecutionDeposit> executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate(
|
||||
pbExecutionDeposit.equals("tradingDate", nowDate)
|
||||
);
|
||||
ImdgPredicateBuilder pbExecutionFond = executionFondImdg.predicateBuilder();
|
||||
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(
|
||||
pbExecutionFond.equals("tradingDate", nowDate)
|
||||
);
|
||||
List<ExecutionCommon> executions = new ArrayList<>();
|
||||
executions.addAll(executionDeposits);
|
||||
executions.addAll(executionFonds);
|
||||
|
||||
Map<Long, String> tradingCodeForCompanyId = new HashMap<>();
|
||||
Map<Long, String> sessionDateForSessionId = new HashMap<>();
|
||||
lines = new ArrayList<>(executions.size());
|
||||
for (ExecutionCommon execution : executions) {
|
||||
try {
|
||||
String sessionId = execution.getSessionId() != null ? String.valueOf(execution.getSessionId()) : "";
|
||||
|
||||
String sessionDate = "";
|
||||
if (execution.getSessionId() != null) {
|
||||
sessionDate = sessionDateForSessionId.get(execution.getSessionId());
|
||||
if (sessionDate == null) {
|
||||
Session session = sessionImdg.getSingleObjectByID(execution.getSessionId());
|
||||
sessionDate = session != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : "";
|
||||
sessionDateForSessionId.put(execution.getSessionId(), sessionDate);
|
||||
}
|
||||
}
|
||||
|
||||
String trId = String.valueOf(execution.getId());
|
||||
|
||||
// todo выяснить, так ли это
|
||||
String firmId = "";
|
||||
if (execution.getCompanyId() != null) {
|
||||
firmId = tradingCodeForCompanyId.get(execution.getCompanyId());
|
||||
if (firmId == null) {
|
||||
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
|
||||
firmId = company != null && company.getTradingCode() != null ? company.getTradingCode() : "";
|
||||
tradingCodeForCompanyId.put(execution.getCompanyId(), firmId);
|
||||
}
|
||||
}
|
||||
|
||||
String tkr = execution.getTradingClearingRegistryId() != null ? String.valueOf(execution.getTradingClearingRegistryId()) : "";
|
||||
|
||||
String cashLiability = "";
|
||||
String depoLiability = "";
|
||||
if (execution instanceof ExecutionDeposit executionDeposit) {
|
||||
cashLiability = executionDeposit.getFirstLegAmount() != null ? df02Format.format(executionDeposit.getFirstLegAmount()) : "";
|
||||
} else if (execution instanceof ExecutionFond executionFond) {
|
||||
cashLiability = executionFond.getSettlementAmount() != null ? df02Format.format(executionFond.getSettlementAmount()) : "";
|
||||
depoLiability = executionFond.getQuantity() != null ? executionFond.getQuantity().toString() : "";
|
||||
}
|
||||
|
||||
String tradeNum = execution.getExchangeExecutionId() != null ? String.valueOf(execution.getExchangeExecutionId()) : "";
|
||||
String classCode = "";
|
||||
String tradeDate = execution.getExchangeExecutionTime() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(execution.getExchangeExecutionTime(), ZoneId.systemDefault())) : "";
|
||||
|
||||
String status = "";
|
||||
if (execution.getCoverageStatus() != null) {
|
||||
String coverageStatus = execution.getCoverageStatus().toUpperCase();
|
||||
CoverageStatus coverage = IEnumKey.getEnumByKey(CoverageStatus.class, coverageStatus);
|
||||
if (coverage == CoverageStatus.NULL) {
|
||||
status = "0";
|
||||
} else if (coverage == CoverageStatus.ALWD) {
|
||||
status = "1";
|
||||
} else if (coverage == CoverageStatus.DNED) {
|
||||
// todo обсудить
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
Registry registry = registryImdg.getSingleObjectByPredicate(
|
||||
pb.and(
|
||||
pb.equals("sessionId", execution.getSessionId()),
|
||||
pb.regex("registryCode", "[O|T][S|M].[T]")
|
||||
)
|
||||
);
|
||||
if (registry.getRegistryStatus() != null) {
|
||||
String registryStatusStr = registry.getRegistryStatus().toUpperCase();
|
||||
RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registryStatusStr);
|
||||
if (registryStatus == RegistryStatus.NACC || registryStatus == RegistryStatus.NACK) status = "0";
|
||||
else if (registryStatus == RegistryStatus.FAIL) status = "3";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = sessionId;
|
||||
line[valueIdx++] = sessionDate;
|
||||
line[valueIdx++] = trId;
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = tkr;
|
||||
line[valueIdx++] = cashLiability;
|
||||
line[valueIdx++] = depoLiability;
|
||||
line[valueIdx++] = tradeNum;
|
||||
line[valueIdx++] = classCode;
|
||||
line[valueIdx++] = tradeDate;
|
||||
line[valueIdx++] = status;
|
||||
|
||||
lines.add(line);
|
||||
} catch (Throwable e) {
|
||||
log.error("Can't create report row for execution_%s (id = %d), skipped".formatted(execution instanceof ExecutionFond ? "fond" : "deposit", execution.getId()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|||
TestConfig.class
|
||||
})
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
public class ReportServiceTest {
|
||||
public class ReportServiceTest_BP {
|
||||
private static File outFolder;
|
||||
private final ExecutionFond testExecutionFond = new ExecutionFond();
|
||||
private final ExecutionDeposit testExecutionDeposit = new ExecutionDeposit();
|
||||
|
|
@ -201,7 +201,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/operational_liabilities_claims_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/operational_liabilities_claims_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date"));
|
||||
|
||||
testExecutionDeposit.setSessionId(oldSessionIdDeposit);
|
||||
|
|
@ -231,7 +231,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/period_liabilities_claims_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/period_liabilities_claims_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date"));
|
||||
|
||||
outFile.delete();
|
||||
|
|
@ -254,7 +254,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/summary_liabilities_claims_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/summary_liabilities_claims_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date"));
|
||||
|
||||
outFile.delete();
|
||||
|
|
@ -286,7 +286,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/operational_money_change_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/operational_money_change_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time"));
|
||||
|
||||
testRegistry_1.setSessionId(oldRegistrySessionId_1);
|
||||
|
|
@ -316,7 +316,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/period_money_change_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/period_money_change_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time"));
|
||||
|
||||
outFile.delete();
|
||||
|
|
@ -343,7 +343,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/summary_money_change_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/summary_money_change_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time"));
|
||||
|
||||
registryImdg.insert(testRegistryForCompanyId_1);
|
||||
|
|
@ -365,7 +365,7 @@ public class ReportServiceTest {
|
|||
@Order(7)
|
||||
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_1() throws CsvValidationException, IOException {
|
||||
clearTestDir();
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
|
||||
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
|
||||
reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey());
|
||||
|
|
@ -396,7 +396,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_1"))[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_1_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
|
||||
|
||||
for (File file : outFolder.listFiles()) {
|
||||
|
|
@ -417,7 +417,7 @@ public class ReportServiceTest {
|
|||
@Order(8)
|
||||
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_2() throws CsvValidationException, IOException {
|
||||
clearTestDir();
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
|
||||
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
|
||||
reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey());
|
||||
|
|
@ -448,7 +448,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_2"))[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_2_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
|
||||
|
||||
for (File file : outFolder.listFiles()) {
|
||||
|
|
@ -469,7 +469,7 @@ public class ReportServiceTest {
|
|||
@Order(9)
|
||||
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_3() throws CsvValidationException, IOException {
|
||||
clearTestDir();
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
|
||||
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
|
||||
reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey());
|
||||
|
|
@ -497,7 +497,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_3"))[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_3_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
|
||||
|
||||
for (File file : outFolder.listFiles()) {
|
||||
|
|
@ -518,7 +518,7 @@ public class ReportServiceTest {
|
|||
@Order(10)
|
||||
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_4() throws CsvValidationException, IOException {
|
||||
clearTestDir();
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
|
||||
|
||||
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
|
||||
reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey());
|
||||
|
|
@ -547,7 +547,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_4"))[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_4_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
|
||||
|
||||
for (File file : outFolder.listFiles()) {
|
||||
|
|
@ -597,7 +597,7 @@ public class ReportServiceTest {
|
|||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/unfulfilled_deal_report_expected.csv").getFile());
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/unfulfilled_deal_report_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate"));
|
||||
|
||||
testExecutionFond.setSessionId(oldExecutionFondSessionId);
|
||||
|
|
@ -0,0 +1,557 @@
|
|||
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.Producer;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.misc.STrades;
|
||||
import ru.clearing.classes.statics.data.misc.Session;
|
||||
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
|
||||
import ru.clearing.classes.statics.data.profile.ProfileDocument;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.clearing.classes.statics.data.statement.Statement;
|
||||
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest;
|
||||
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.LocalDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
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
|
||||
})
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
public class ReportServiceTest_KS {
|
||||
private static File outFolder;
|
||||
private static int reportRequestCnt = 0;
|
||||
private static int reportRequestWithSessionIdCnt = 0;
|
||||
private static int reportRequestWithSessionIdListCnt = 0;
|
||||
private static int reportRequestWithPeriodCnt = 0;
|
||||
private Imdg<Registry> registryImdg;
|
||||
private Imdg<Company> companyImdg;
|
||||
private Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
|
||||
private Imdg<ExecutionDeposit> executionDepositImdg;
|
||||
private Imdg<ExecutionFond> executionFondImdg;
|
||||
private Imdg<Session> sessionImdg;
|
||||
private Imdg<CompanySymbols> companySymbolsImdg;
|
||||
private Imdg<ProfileDocument> profileDocumentImdg;
|
||||
|
||||
private Long COMPANY_ID;
|
||||
private Imdg<Listing> listingImdg;
|
||||
private Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
|
||||
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
|
||||
private Imdg<PaymentInstruction> paymentInstructionImdg;
|
||||
private Imdg<Statement> statementImdg;
|
||||
private Imdg<STrades> sTradeImdg;
|
||||
@Autowired
|
||||
private ReportService reportService;
|
||||
@Autowired
|
||||
@Qualifier("hazelcastServiceTest")
|
||||
private ImdgProvider imdgProvider;
|
||||
@Autowired
|
||||
@Qualifier("mockProducer")
|
||||
private Producer<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
|
||||
@Order(1)
|
||||
public void createReportTest_KSRepCashRegistriesReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
ReportRequest reportRequest = new ReportRequest();
|
||||
reportRequest.setReportId(ReportType.KS_REP_CASH_REGISTERS.getKey());
|
||||
|
||||
RegistryCodeDictionary registryCodeDictionary = new RegistryCodeDictionary();
|
||||
registryCodeDictionary.setCode("AM_T");
|
||||
registryCodeDictionary.setName("AM_T_NAME");
|
||||
registryCodeDictionaryImdg.insert(registryCodeDictionary);
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setCompanyId(COMPANY_ID);
|
||||
registry.setRegistryCode("AM_T");
|
||||
registry.setUpdated(Instant.now());
|
||||
registry.setTradingCode("TRADING_CODE");
|
||||
registry.setAccount("ACCOUNT");
|
||||
registry.setAccountType(AccountType.Clrn.getKey());
|
||||
registry.setOpenBalance(BigDecimal.valueOf(77.777777777));
|
||||
registry.setSettledCredit(BigDecimal.valueOf(88.88888888));
|
||||
registry.setSettledDebit(BigDecimal.valueOf(22.2222222));
|
||||
registry.setCredit(BigDecimal.valueOf(88.88888888));
|
||||
registry.setDebit(BigDecimal.valueOf(22.2222222));
|
||||
registry.setCloseBalance(BigDecimal.valueOf(11.11111111));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT,
|
||||
reportRequestCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("DATE"));
|
||||
|
||||
registryCodeDictionaryImdg.delete(registryCodeDictionary);
|
||||
registryImdg.delete(registry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(2)
|
||||
public void createReportTest_KSRepCashRegisterSumsReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
ReportRequest reportRequest = new ReportRequest();
|
||||
reportRequest.setReportId(ReportType.KS_REP_CASH_REGISTER_SUMS.getKey());
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setCompanyId(COMPANY_ID);
|
||||
registry.setRegistryCode("AM__");
|
||||
registry.setUpdated(Instant.now());
|
||||
registry.setTradingCode("TRADING_CODE");
|
||||
registry.setAccount("ACCOUNT");
|
||||
registry.setAccountType(AccountType.Clrn.getKey());
|
||||
registry.setDebit(BigDecimal.valueOf(22.2222222));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT,
|
||||
reportRequestCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("ADD_DATE"));
|
||||
|
||||
registryImdg.delete(registry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(3)
|
||||
public void createReportTest_KSRepDepoRegistriesReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
ReportRequest reportRequest = new ReportRequest();
|
||||
reportRequest.setReportId(ReportType.KS_REP_DEPO_REGISTERS.getKey());
|
||||
|
||||
RegistryCodeDictionary registryCodeDictionary = new RegistryCodeDictionary();
|
||||
registryCodeDictionary.setCode("AS_T");
|
||||
registryCodeDictionary.setName("AS_T_NAME");
|
||||
registryCodeDictionaryImdg.insert(registryCodeDictionary);
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setCompanyId(COMPANY_ID);
|
||||
registry.setRegistryCode("AS_T");
|
||||
registry.setUpdated(Instant.now());
|
||||
registry.setTradingCode("TRADING_CODE");
|
||||
registry.setAccount("ACCOUNT");
|
||||
registry.setAccountType(AccountType.Depo.getKey());
|
||||
registry.setOpenBalance(BigDecimal.valueOf(77.777777777));
|
||||
registry.setSettledCredit(BigDecimal.valueOf(88.88888888));
|
||||
registry.setSettledDebit(BigDecimal.valueOf(22.2222222));
|
||||
registry.setCredit(BigDecimal.valueOf(88.88888888));
|
||||
registry.setDebit(BigDecimal.valueOf(22.2222222));
|
||||
registry.setCloseBalance(BigDecimal.valueOf(11.11111111));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT,
|
||||
reportRequestCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("DATE"));
|
||||
|
||||
registryCodeDictionaryImdg.delete(registryCodeDictionary);
|
||||
registryImdg.delete(registry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(4)
|
||||
public void createReportTest_KSRepDepoRegisterQuantitiesReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
ReportRequest reportRequest = new ReportRequest();
|
||||
reportRequest.setReportId(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES.getKey());
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setCompanyId(COMPANY_ID);
|
||||
registry.setRegistryCode("AS__");
|
||||
registry.setSecuritySymbol("SECURITY_SYMBOL");
|
||||
registry.setUpdated(Instant.now());
|
||||
registry.setTradingCode("TRADING_CODE");
|
||||
registry.setAccount("ACCOUNT");
|
||||
registry.setAccountType(AccountType.Depo.getKey());
|
||||
registry.setDebit(BigDecimal.valueOf(22.2222222));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT,
|
||||
reportRequestCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("ADD_DATE"));
|
||||
|
||||
registryImdg.delete(registry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(5)
|
||||
public void createReportTest_KSRepTradesReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
ReportRequest reportRequest = new ReportRequest();
|
||||
reportRequest.setReportId(ReportType.KS_REP_TRADES.getKey());
|
||||
|
||||
Session session_1 = new Session();
|
||||
session_1.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2023, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
|
||||
Long sessionId_1 = sessionImdg.insert(session_1);
|
||||
|
||||
Session session_2 = new Session();
|
||||
session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
|
||||
Long sessionId_2 = sessionImdg.insert(session_2);
|
||||
|
||||
ExecutionFond executionFond = new ExecutionFond();
|
||||
executionFond.setCompanyId(COMPANY_ID);
|
||||
executionFond.setTradingDate(LocalDate.now());
|
||||
executionFond.setSessionId(sessionId_1);
|
||||
executionFond.setTradingClearingRegistryId(666L);
|
||||
executionFond.setSettlementAmount(BigDecimal.valueOf(8888.888888));
|
||||
executionFond.setQuantity(BigDecimal.valueOf(123.456789));
|
||||
executionFond.setExchangeExecutionId(222L);
|
||||
executionFond.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
|
||||
executionFond.setCoverageStatus(CoverageStatus.ALWD.getKey());
|
||||
executionFondImdg.insert(executionFond);
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setSessionId(sessionId_2);
|
||||
registry.setRegistryCode("OM_T");
|
||||
registry.setRegistryStatus(RegistryStatus.FAIL.getKey());
|
||||
registryImdg.insert(registry);
|
||||
|
||||
ExecutionDeposit executionDeposit = new ExecutionDeposit();
|
||||
executionDeposit.setCompanyId(COMPANY_ID);
|
||||
executionDeposit.setTradingDate(LocalDate.now());
|
||||
executionDeposit.setSessionId(sessionId_2);
|
||||
executionDeposit.setTradingClearingRegistryId(666L);
|
||||
executionDeposit.setFirstLegAmount(BigDecimal.valueOf(8888.888888));
|
||||
executionDeposit.setExchangeExecutionId(222L);
|
||||
executionDeposit.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
|
||||
executionDeposit.setCoverageStatus(CoverageStatus.DNED.getKey());
|
||||
executionDepositImdg.insert(executionDeposit);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT,
|
||||
reportRequestCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_TRADES_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID","TR_ID"));
|
||||
|
||||
executionDepositImdg.delete(executionDeposit);
|
||||
executionFondImdg.delete(executionFond);
|
||||
sessionImdg.delete(session_1);
|
||||
sessionImdg.delete(session_2);
|
||||
registryImdg.delete(registry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(6)
|
||||
public void createReportTest_KSRepCashNettoReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
Session session = new Session();
|
||||
session.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
|
||||
Long sessionId = sessionImdg.insert(session);
|
||||
|
||||
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
|
||||
reportRequest.setReportId(ReportType.KS_REP_CASH_NETTO.getKey());
|
||||
reportRequest.setSessionId(sessionId);
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setTradingCode("TRADING_CODE");
|
||||
registry.setClearingDate(LocalDate.now());
|
||||
registry.setRegistryCode("TM_T");
|
||||
registry.setSessionId(sessionId);
|
||||
registry.setAccount("ACCOUNT");
|
||||
registry.setAccountType(AccountType.Clrn.getKey());
|
||||
registry.setBalance(BigDecimal.valueOf(22.2222222));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT_FOR_SESSION_ID,
|
||||
reportRequestWithSessionIdCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID", "DATE"));
|
||||
|
||||
registryImdg.delete(registry);
|
||||
sessionImdg.delete(session);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(7)
|
||||
public void createReportTest_KSRepDepoNettoReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
Session session = new Session();
|
||||
session.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
|
||||
Long sessionId = sessionImdg.insert(session);
|
||||
|
||||
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
|
||||
reportRequest.setReportId(ReportType.KS_REP_DEPO_NETTO.getKey());
|
||||
reportRequest.setSessionId(sessionId);
|
||||
|
||||
Registry registry = new Registry();
|
||||
registry.setTradingCode("TRADING_CODE");
|
||||
registry.setClearingDate(LocalDate.now());
|
||||
registry.setRegistryCode("TS_T");
|
||||
registry.setSecuritySymbol("SECURITY_SYMBOL");
|
||||
registry.setSessionId(sessionId);
|
||||
registry.setAccount("ACCOUNT");
|
||||
registry.setAccountType(AccountType.Depo.getKey());
|
||||
registry.setBalance(BigDecimal.valueOf(22.2222222));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT_FOR_SESSION_ID,
|
||||
reportRequestWithSessionIdCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_NETTO_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID", "DATE"));
|
||||
|
||||
registryImdg.delete(registry);
|
||||
sessionImdg.delete(session);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(8)
|
||||
public void createReportTest_KSRepFirmDetailsReport() throws IOException, CsvValidationException {
|
||||
clearTestDir();
|
||||
|
||||
ReportRequest reportRequest = new ReportRequest();
|
||||
reportRequest.setReportId(ReportType.KS_REP_FIRM_DETAILS.getKey());
|
||||
|
||||
Collection<Company> oldCompanies = companyImdg.getAllValues();
|
||||
for (Company company : oldCompanies) {
|
||||
companyImdg.delete(company);
|
||||
}
|
||||
|
||||
Company company = new Company();
|
||||
company.setTradingCode("TRADING_CODE");
|
||||
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
|
||||
company.setFullName("FULL_NAME");
|
||||
Long companyId = companyImdg.insert(company);
|
||||
|
||||
CompanySymbols inn = new CompanySymbols();
|
||||
inn.setCompanyId(companyId);
|
||||
inn.setCompanySymbol(CompanySymbol.INN.getKey());
|
||||
inn.setCompanySymbolValue("INN___");
|
||||
companySymbolsImdg.insert(inn);
|
||||
|
||||
CompanySymbols cpp = new CompanySymbols();
|
||||
cpp.setCompanyId(companyId);
|
||||
cpp.setCompanySymbol(CompanySymbol.CPP.getKey());
|
||||
cpp.setCompanySymbolValue("CPP____");
|
||||
companySymbolsImdg.insert(cpp);
|
||||
|
||||
ProfileDocument profileDocument = new ProfileDocument();
|
||||
profileDocument.setCompanyId(companyId);
|
||||
profileDocument.setDocumentType(DocumentTypes.cntr.getKey());
|
||||
profileDocument.setNumber("NUMBER");
|
||||
profileDocument.setIssueDate(LocalDate.of(1999, 1, 1));
|
||||
profileDocument.setName("NAME");
|
||||
profileDocumentImdg.insert(profileDocument);
|
||||
|
||||
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
|
||||
|
||||
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
|
||||
Consts.CREATE_REPORT,
|
||||
reportRequestCnt++,
|
||||
0,
|
||||
jsonString);
|
||||
|
||||
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||
|
||||
File outFile = outFolder.listFiles()[0];
|
||||
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_FIRM_DETAILS_expected.csv").getFile());
|
||||
compareCSVFiles(expectedFile, outFile, Collections.emptyList());
|
||||
|
||||
companySymbolsImdg.delete(inn);
|
||||
companySymbolsImdg.delete(cpp);
|
||||
profileDocumentImdg.delete(profileDocument);
|
||||
companyImdg.delete(company);
|
||||
for (Company currCompany : oldCompanies) {
|
||||
if (Objects.equals(currCompany.getId(), COMPANY_ID)) {
|
||||
COMPANY_ID = companyImdg.insert(currCompany);
|
||||
} else {
|
||||
companyImdg.insert(currCompany);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void compareCSVFiles(File expectedFile, File actualFile, List<String> columnsForSkip) throws IOException, CsvValidationException {
|
||||
if (columnsForSkip == null) columnsForSkip = Collections.emptyList();
|
||||
CSVParser csvParser = new CSVParserBuilder().withSeparator(',').withQuoteChar('\"').build();
|
||||
CSVReader expectedCSVReader = new CSVReaderBuilder(new FileReader(expectedFile)).withCSVParser(csvParser).build();
|
||||
CSVReader actualCSVReader = new CSVReaderBuilder(new FileReader(actualFile)).withCSVParser(csvParser).build();
|
||||
|
||||
Map<String, Integer> expectedValueForColumn = new HashMap<>();
|
||||
Map<String, Integer> actualValueForColumn = new HashMap<>();
|
||||
|
||||
String[] expectedHeaders = expectedCSVReader.readNext();
|
||||
String[] actualHeaders = actualCSVReader.readNext();
|
||||
assertEquals(expectedHeaders.length, actualHeaders.length);
|
||||
|
||||
for (int headerIdx = 0; headerIdx < expectedHeaders.length; headerIdx++) {
|
||||
String expectedHeader = expectedHeaders[headerIdx];
|
||||
String actualHeader = actualHeaders[headerIdx];
|
||||
if (!columnsForSkip.contains(expectedHeader)) expectedValueForColumn.put(expectedHeader, headerIdx);
|
||||
if (!columnsForSkip.contains(actualHeader)) actualValueForColumn.put(actualHeader, headerIdx);
|
||||
}
|
||||
|
||||
do {
|
||||
String[] expectedLines = expectedCSVReader.readNext();
|
||||
String[] actualLines = actualCSVReader.readNext();
|
||||
if (expectedLines == null || actualLines == null) {
|
||||
if (expectedLines == null && actualLines == null) {
|
||||
break;
|
||||
}
|
||||
Assertions.fail("expected and actual lines not equal");
|
||||
}
|
||||
for (String expectedHeader : expectedValueForColumn.keySet()) {
|
||||
int expectedIdx = expectedValueForColumn.get(expectedHeader);
|
||||
int actualIdx = actualValueForColumn.get(expectedHeader);
|
||||
String expected = expectedLines[expectedIdx];
|
||||
String actual = actualLines[actualIdx];
|
||||
assertEquals(expected, actual, expectedHeader);
|
||||
}
|
||||
} while (true);
|
||||
|
||||
expectedCSVReader.close();
|
||||
actualCSVReader.close();
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
private void init() {
|
||||
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class);
|
||||
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
Company company = new Company();
|
||||
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
|
||||
company.setTradingCode("TRADING_CODE");
|
||||
COMPANY_ID = companyImdg.insert(company);
|
||||
|
||||
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
|
||||
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
|
||||
}
|
||||
|
||||
private void clearTestDir() throws IOException {
|
||||
FileUtils.deleteDirectory(outFolder);
|
||||
outFolder.mkdir();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"0","3007","777","07.05.2023","17.05.2023","17.05.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"0","3007","777","17.05.2023","17.05.2023","17.05.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"0","3007","777","27.05.2023","17.05.2023","27.05.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"0","3007","777","27.05.2023","17.05.2023","17.05.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"test-security-symbol-1","777","20.06.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"test-security-symbol-1","777","30.06.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"test-security-symbol-1","777","10.07.2023","25.08.1994","10.07.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
"test-security-symbol-1","777","10.07.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777"
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
securityId,tradeNo,tradeDate,settleCode
|
||||
"3007","777","20.06.2023","test-class-code"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,SESSION_ID,SESSION_DATE,ACCOUNT,VALUE,DATE
|
||||
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22,22","30.06.2023"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,ACCOUNT,DATE,REGISTER_CODE,REGISTER_NAME,OPEN_BALANCE,CHANGE_BALANCE,ADD_WITHDRAW,CLOSE_BALANCE,REMARKS
|
||||
"TRADING_CODE","ACCOUNT","30.06.2023","AM_T","AM_T_NAME","77,78","66,67","66,67","11,11",""
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,ACCOUNT,REGISTER_CODE,ADD_SUM,ADD_TIME,ADD_DATE
|
||||
"TRADING_CODE","ACCOUNT","AM__","22,22","","30.06.2023"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,SESSION_ID,SESSION_DATE,ACCOUNT,SECURITYID,VALUE,DATE
|
||||
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","SECURITY_SYMBOL","22,22","30.06.2023"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,ACCOUNT,DATE,SECURITYID,REGISTER_CODE,REGISTER_NAME,OPEN_QUANTITY,CHANGE_QUANTITY,ADD_WITHDRAW_DEPO,CLOSE_QUANTITY,REMARKS
|
||||
"TRADING_CODE","ACCOUNT","30.06.2023","","AS_T","AS_T_NAME","77.777777777","66.66666668","66.66666668","11.11111111",""
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,ACCOUNT,SECURITYID,REGISTER_CODE,ADD_QUANTITY,ADD_TIME,ADD_DATE
|
||||
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","22,22","","30.06.2023"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
FIRMID,PART_INN,PART_KPP,AGREEMENT_NUMBER,AGREEMENT_DATE,AGREEMENT_NAME,FIRM_NAME
|
||||
"TRADING_CODE","INN___","CPP____","NUMBER","01.01.1999","NAME","FULL_NAME"
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
SESSION_ID,SESSION_DATE,TR_ID,FIRM_ID,TKR,CASH_LIABILITY,DEPO_LIABILITY,TRADE_NUM,CLASS_CODE,TRADE_DATE,STATUS
|
||||
"3","20.01.1970T07:09:07","6","TRADING_CODE","666","8888,89","","222","","20.01.1970T02:49:58","3"
|
||||
"2","20.01.1970T15:54:43","4","TRADING_CODE","666","8888,89","123.456789","222","","20.01.1970T02:49:58","1"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
id,securityId,tradeNo,tradeDate,settleCode
|
||||
"0","3007","777","07.05.2023","test-class-code"
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package ru.spcex.platform.enumeration;
|
||||
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
public enum CoverageStatus implements IEnumKey {
|
||||
NULL("NULL"),
|
||||
ALWD("ALWD"),
|
||||
DNED("DNED"),
|
||||
;
|
||||
|
||||
private final String key;
|
||||
|
||||
CoverageStatus(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,14 @@ public enum ReportType implements IEnumKey {
|
|||
PERIOD_MONEY_CHANGE("period-money-change"),
|
||||
EXECUTED_DEAL_REPORT("executed-deal-report"),
|
||||
UNFULFILLED_DEAL_REPORT("unfulfilled-deal-report"),
|
||||
KS_REP_CASH_REGISTERS("ks_rep_cash_registers"),
|
||||
KS_REP_CASH_REGISTER_SUMS("ks_rep_cash_register_sums"),
|
||||
KS_REP_DEPO_REGISTERS("ks_rep_depo_registers"),
|
||||
KS_REP_DEPO_REGISTER_QUANTITIES("ks_rep_depo_register_quantities"),
|
||||
KS_REP_TRADES("ks_rep_trades"),
|
||||
KS_REP_CASH_NETTO("ks_rep_cash_netto"),
|
||||
KS_REP_DEPO_NETTO("ks_rep_depo_netto"),
|
||||
KS_REP_FIRM_DETAILS("ks_rep_firm_details")
|
||||
;
|
||||
|
||||
private final String key;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue