This commit is contained in:
akulikov 2023-06-30 15:20:14 +03:00
parent 7f9d8badec
commit 717e861fe0
43 changed files with 1710 additions and 71 deletions

View file

@ -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;
}

View file

@ -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),

View file

@ -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 отчета

View file

@ -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;

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);

View file

@ -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();
}
}

View file

@ -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 id securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 0 3007 777 07.05.2023 17.05.2023 17.05.2023 test-settle-code 1000 7777 7777777

View file

@ -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 id securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 0 3007 777 17.05.2023 17.05.2023 17.05.2023 test-settle-code 1000 7777 7777777

View file

@ -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 id securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 0 3007 777 27.05.2023 17.05.2023 27.05.2023 test-settle-code 1000 7777 7777777

View file

@ -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 id securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 0 3007 777 27.05.2023 17.05.2023 17.05.2023 test-settle-code 1000 7777 7777777

View file

@ -1 +0,0 @@
id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
1 id securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value

View file

@ -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"
1 securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 test-security-symbol-1 777 20.06.2023 25.08.1994 30.06.2023 test-settle-code 1000 7777 7777777

View file

@ -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"
1 securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 test-security-symbol-1 777 30.06.2023 25.08.1994 30.06.2023 test-settle-code 1000 7777 7777777

View file

@ -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"
1 securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 test-security-symbol-1 777 10.07.2023 25.08.1994 10.07.2023 test-settle-code 1000 7777 7777777

View file

@ -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"
1 securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value
2 test-security-symbol-1 777 10.07.2023 25.08.1994 30.06.2023 test-settle-code 1000 7777 7777777

View file

@ -0,0 +1 @@
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
1 securityId tradeNo tradeDate tradeTime settleDate settleCode price quanity value

View file

@ -0,0 +1,2 @@
securityId,tradeNo,tradeDate,settleCode
"3007","777","20.06.2023","test-class-code"
1 securityId tradeNo tradeDate settleCode
2 3007 777 20.06.2023 test-class-code

View file

@ -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"
1 FIRMID SESSION_ID SESSION_DATE ACCOUNT VALUE DATE
2 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT 22,22 30.06.2023

View file

@ -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",""
1 FIRMID ACCOUNT DATE REGISTER_CODE REGISTER_NAME OPEN_BALANCE CHANGE_BALANCE ADD_WITHDRAW CLOSE_BALANCE REMARKS
2 TRADING_CODE ACCOUNT 30.06.2023 AM_T AM_T_NAME 77,78 66,67 66,67 11,11

View file

@ -0,0 +1,2 @@
FIRMID,ACCOUNT,REGISTER_CODE,ADD_SUM,ADD_TIME,ADD_DATE
"TRADING_CODE","ACCOUNT","AM__","22,22","","30.06.2023"
1 FIRMID ACCOUNT REGISTER_CODE ADD_SUM ADD_TIME ADD_DATE
2 TRADING_CODE ACCOUNT AM__ 22,22 30.06.2023

View file

@ -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"
1 FIRMID SESSION_ID SESSION_DATE ACCOUNT SECURITYID VALUE DATE
2 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT SECURITY_SYMBOL 22,22 30.06.2023

View file

@ -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",""
1 FIRMID ACCOUNT DATE SECURITYID REGISTER_CODE REGISTER_NAME OPEN_QUANTITY CHANGE_QUANTITY ADD_WITHDRAW_DEPO CLOSE_QUANTITY REMARKS
2 TRADING_CODE ACCOUNT 30.06.2023 AS_T AS_T_NAME 77.777777777 66.66666668 66.66666668 11.11111111

View file

@ -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"
1 FIRMID ACCOUNT SECURITYID REGISTER_CODE ADD_QUANTITY ADD_TIME ADD_DATE
2 TRADING_CODE ACCOUNT SECURITY_SYMBOL AS__ 22,22 30.06.2023

View file

@ -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"
1 FIRMID PART_INN PART_KPP AGREEMENT_NUMBER AGREEMENT_DATE AGREEMENT_NAME FIRM_NAME
2 TRADING_CODE INN___ CPP____ NUMBER 01.01.1999 NAME FULL_NAME

View file

@ -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 SESSION_ID SESSION_DATE TR_ID FIRM_ID TKR CASH_LIABILITY DEPO_LIABILITY TRADE_NUM CLASS_CODE TRADE_DATE STATUS
2 3 20.01.1970T07:09:07 6 TRADING_CODE 666 8888,89 222 20.01.1970T02:49:58 3
3 2 20.01.1970T15:54:43 4 TRADING_CODE 666 8888,89 123.456789 222 20.01.1970T02:49:58 1

View file

@ -1,2 +0,0 @@
id,securityId,tradeNo,tradeDate,settleCode
"0","3007","777","07.05.2023","test-class-code"
1 id securityId tradeNo tradeDate settleCode
2 0 3007 777 07.05.2023 test-class-code

View file

@ -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;
}
}

View file

@ -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;