akulikov 2023-07-17 14:45:34 +03:00
parent 07293ff3eb
commit 95ff52de20
12 changed files with 224 additions and 104 deletions

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName; import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition; import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber; import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -28,10 +29,12 @@ public class KSRepCashRegisterSumsReport {
@CsvBindByName(column = "ADD_TIME") @CsvBindByName(column = "ADD_TIME")
@CsvBindByPosition(position = 4) @CsvBindByPosition(position = 4)
@CsvDate(value = "HH:mm:ss")
private LocalTime addTime; private LocalTime addTime;
@CsvBindByName(column = "ADD_DATE") @CsvBindByName(column = "ADD_DATE")
@CsvBindByPosition(position = 5) @CsvBindByPosition(position = 5)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate addDate; private LocalDate addDate;

View file

@ -33,6 +33,7 @@ public class KSRepDepoRegisterQuantitiesReport {
@CsvBindByName(column = "ADD_TIME") @CsvBindByName(column = "ADD_TIME")
@CsvBindByPosition(position = 5) @CsvBindByPosition(position = 5)
@CsvDate(value = "HH:mm:ss")
private LocalTime addTime; private LocalTime addTime;
@CsvBindByName(column = "ADD_DATE") @CsvBindByName(column = "ADD_DATE")

View file

@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.reports.ks;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder; import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams; import ru.spcex.clearing.reports.reports.EmptyParams;
@ -12,10 +13,12 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -23,14 +26,16 @@ import java.util.List;
@Component @Component
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegisterSumsReport> { public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegisterSumsReport> {
private final Imdg<Statement> statementImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private List<KSRepCashRegisterSumsReport> rows = null; private List<KSRepCashRegisterSumsReport> rows = null;
public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) { public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
} }
@Override @Override
@ -63,48 +68,65 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
LocalDate nowDate = LocalDate.now(); LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now(); Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build();
ImdgPredicate finalPredicate = pb.and( ImdgPredicate finalPredicate = pb.and(
pb.sql(sql),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.or( pb.equals("inOutSDfType", InOutSDfType.type6.getKey()),
pb.equals("accountType", AccountType.Clrn.getKey()), pb.equals("operationStatus", OperationStatus.Executed.getKey()),
pb.equals("accountType", AccountType.Info.getKey()) pb.notNull("amount")
)
); );
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); Collection<Statement> statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate);
rows = new ArrayList<>(registries.size()); rows = new ArrayList<>(statements.size());
for (Registry registry : registries) { for (Statement statement : statements) {
try { try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); Company company = companyImdg.getSingleObjectByID(statement.getAddresseeId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
// Если есть одновременно registry.credit и registry.debit, записываем две записи по одному registry ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
if (registry.getCredit() != null) { Registry registry = registryImdg.getSingleObjectByPredicate(
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport(); pbRegistry.and(
ksRepCashRegisterSumsReport.setFirmId(registry.getTradingCode()); pbRegistry.equals("companyId", statement.getAddresseeId()),
ksRepCashRegisterSumsReport.setAccount(registry.getAccount()); pbRegistry.equals("account", statement.getAccount()),
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode()); pbRegistry.in("accountType", AccountType.Clrn.getKey(), AccountType.Info.getKey()),
ksRepCashRegisterSumsReport.setAddDate(nowDate); pbRegistry.notNull("registryCode")
ksRepCashRegisterSumsReport.setAddTime(null); )
ksRepCashRegisterSumsReport.setAddSum(registry.getCredit()); );
rows.add(ksRepCashRegisterSumsReport); if (registry == null) {
} log.warn(
if (registry.getDebit() != null) { "Can't find registry for companyId = {} and account = {}. Statement id = {} skipped",
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport(); statement.getAddresseeId(),
ksRepCashRegisterSumsReport.setFirmId(registry.getTradingCode()); statement.getAccount(),
ksRepCashRegisterSumsReport.setAccount(registry.getAccount()); statement.getId()
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode()); );
ksRepCashRegisterSumsReport.setAddDate(nowDate); continue;
ksRepCashRegisterSumsReport.setAddTime(null);
ksRepCashRegisterSumsReport.setAddSum(registry.getDebit().negate());
rows.add(ksRepCashRegisterSumsReport);
} }
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport();
ksRepCashRegisterSumsReport.setFirmId(String.valueOf(statement.getAddresseeId()));
ksRepCashRegisterSumsReport.setAccount(statement.getAccount());
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode());
ksRepCashRegisterSumsReport.setAddDate(nowDate);
ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(statement.getUpdated(), ZoneId.systemDefault()));
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
if (inOutDirection == InOutDirection.in) {
ksRepCashRegisterSumsReport.setAddSum(statement.getAmount());
} else if (inOutDirection == InOutDirection.out) {
ksRepCashRegisterSumsReport.setAddSum(statement.getAmount().negate());
} else {
log.warn(
"Invalid statement.in_out_direction ({}). Statement id = {} skipped",
statement.getInOutDirection(),
statement.getId()
);
continue;
}
rows.add(ksRepCashRegisterSumsReport);
} catch (Throwable e) { } catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); log.error("Can't create report row for registry (id = %d), skipped".formatted(statement.getId()), e);
} }
} }
} }

View file

@ -2,7 +2,12 @@ package ru.spcex.clearing.reports.reports.ks;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder; import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams; import ru.spcex.clearing.reports.reports.EmptyParams;
@ -12,10 +17,12 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -23,14 +30,22 @@ import java.util.List;
@Component @Component
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegisterQuantitiesReport> { public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegisterQuantitiesReport> {
private final Imdg<Statement> statementImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
private List<KSRepDepoRegisterQuantitiesReport> rows = null; private List<KSRepDepoRegisterQuantitiesReport> rows = null;
public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) { public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) {
statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
} }
@Override @Override
@ -63,49 +78,102 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
LocalDate nowDate = LocalDate.now(); LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now(); Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS__).build();
ImdgPredicate finalPredicate = pb.and( ImdgPredicate finalPredicate = pb.and(
pb.sql(sql),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("accountType", AccountType.Depo.getKey()) pb.equals("inOutSDfType", InOutSDfType.type10.getKey()),
pb.equals("operationStatus", OperationStatus.Executed.getKey())
); );
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); Collection<Statement> statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate);
rows = new ArrayList<>(registries.size()); rows = new ArrayList<>(statements.size());
for (Registry registry : registries) { for (Statement statement : statements) {
try { try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); Company company = companyImdg.getSingleObjectByID(statement.getAddresseeId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
// Если есть одновременно registry.credit и registry.debit, записываем две записи по одному registry ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
if (registry.getCredit() != null) { Registry registry = registryImdg.getSingleObjectByPredicate(
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport(); pbRegistry.and(
ksRepDepoRegisterQuantitiesReport.setFirmId(registry.getTradingCode()); pbRegistry.equals("companyId", statement.getAddresseeId()),
ksRepDepoRegisterQuantitiesReport.setAccount(registry.getAccount()); pbRegistry.equals("account", statement.getAccount()),
ksRepDepoRegisterQuantitiesReport.setSecurityId(registry.getSecuritySymbol()); pbRegistry.equals("accountType", AccountType.Depo.getKey()),
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode()); pbRegistry.notNull("registryCode")
ksRepDepoRegisterQuantitiesReport.setAddTime(null); )
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate); );
ksRepDepoRegisterQuantitiesReport.setAddQuantity(registry.getCredit()); if (registry == null) {
rows.add(ksRepDepoRegisterQuantitiesReport); log.warn(
} "Can't find registry for companyId = {} and account: {}. Statement id = {} skipped",
if (registry.getDebit() != null) { statement.getAddresseeId(),
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport(); statement.getAccount(),
ksRepDepoRegisterQuantitiesReport.setFirmId(registry.getTradingCode()); statement.getId()
ksRepDepoRegisterQuantitiesReport.setAccount(registry.getAccount()); );
ksRepDepoRegisterQuantitiesReport.setSecurityId(registry.getSecuritySymbol()); continue;
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegisterQuantitiesReport.setAddTime(null);
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate);
ksRepDepoRegisterQuantitiesReport.setAddQuantity(registry.getDebit().negate());
rows.add(ksRepDepoRegisterQuantitiesReport);
} }
Security security = getSecurityWithSecuritySymbolForId(statement.getSecurityId());
if (security == null) {
log.warn(
"Can't find security for securityId = {}. Statement id = {} skipped",
statement.getSecurityId(),
statement.getId()
);
continue;
}
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport();
ksRepDepoRegisterQuantitiesReport.setFirmId(String.valueOf(statement.getAddresseeId()));
ksRepDepoRegisterQuantitiesReport.setAccount(statement.getAccount());
ksRepDepoRegisterQuantitiesReport.setSecurityId(security.getSecuritySymbol());
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate);
ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(statement.getUpdated(), ZoneId.systemDefault()));
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
if (inOutDirection == InOutDirection.in) {
ksRepDepoRegisterQuantitiesReport.setAddQuantity(statement.getAmount());
} else if (inOutDirection == InOutDirection.out) {
ksRepDepoRegisterQuantitiesReport.setAddQuantity(statement.getAmount().negate());
} else {
log.warn(
"Invalid statement.in_out_direction ({}). Statement id = {} skipped",
statement.getInOutDirection(),
statement.getId()
);
continue;
}
rows.add(ksRepDepoRegisterQuantitiesReport);
} catch (Throwable e) { } catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); log.error("Can't create report row for registry (id = %d), skipped".formatted(statement.getId()), e);
} }
} }
} }
private Security getSecurityWithSecuritySymbolForId(Long securityId) {
Security security;
security = equitySecurityImdg.getFirstObjectByPredicate(
equitySecurityImdg.predicateBuilder().and(
equitySecurityImdg.predicateBuilder().equals("securityId", securityId),
equitySecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
if (security == null) {
security = fixedIncomeSecurityImdg.getFirstObjectByPredicate(
fixedIncomeSecurityImdg.predicateBuilder().and(
fixedIncomeSecurityImdg.predicateBuilder().equals("securityId", securityId),
fixedIncomeSecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
}
if (security == null)
security = moneyMarketSecurityImdg.getFirstObjectByPredicate(
moneyMarketSecurityImdg.predicateBuilder().and(
moneyMarketSecurityImdg.predicateBuilder().equals("securityId", securityId),
moneyMarketSecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
return security;
}
} }

View file

@ -123,11 +123,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
} else if (coverage == CoverageStatus.DNED) { } else if (coverage == CoverageStatus.DNED) {
String marketCode = execution.getMarket(); String marketCode = execution.getMarket();
Market market = marketImdg.getSingleObjectByFieldValues(Map.of( Market market = marketImdg.getFirstObjectByFieldValues(Map.of("code", marketCode));
"code",
marketCode
)
);
if (market == null) { if (market == null) {
log.warn( log.warn(
"Broken execution (can't find market for market.code = {}). Execution (id = {}) skipped", "Broken execution (can't find market for market.code = {}). Execution (id = {}) skipped",

View file

@ -18,10 +18,12 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.clearing.platform.dictionary.RegistryCodeDictionary; import ru.clearing.platform.dictionary.RegistryCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -70,6 +72,7 @@ public class ReportServiceTest_KS {
private static int reportRequestWithSessionIdCnt = 0; private static int reportRequestWithSessionIdCnt = 0;
private static int reportRequestWithSessionIdListCnt = 0; private static int reportRequestWithSessionIdListCnt = 0;
private static int reportRequestWithPeriodCnt = 0; private static int reportRequestWithPeriodCnt = 0;
private Imdg<Statement> statementImdg;
private Imdg<Registry> registryImdg; private Imdg<Registry> registryImdg;
private Imdg<Market> marketImdg; private Imdg<Market> marketImdg;
private Imdg<Company> companyImdg; private Imdg<Company> companyImdg;
@ -79,6 +82,7 @@ public class ReportServiceTest_KS {
private Imdg<Session> sessionImdg; private Imdg<Session> sessionImdg;
private Imdg<CompanySymbols> companySymbolsImdg; private Imdg<CompanySymbols> companySymbolsImdg;
private Imdg<ProfileDocument> profileDocumentImdg; private Imdg<ProfileDocument> profileDocumentImdg;
private Imdg<EquitySecurity> equitySecurityImdg;
private Long COMPANY_ID; private Long COMPANY_ID;
@Autowired @Autowired
@ -161,17 +165,21 @@ public class ReportServiceTest_KS {
Registry registry_1 = new Registry(); Registry registry_1 = new Registry();
registry_1.setCompanyId(COMPANY_ID); registry_1.setCompanyId(COMPANY_ID);
registry_1.setRegistryCode("AM__");
registry_1.setRegistryDesignation(RegistryDesignation.A.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_1.setUpdated(Instant.now());
registry_1.setTradingCode("TRADING_CODE");
registry_1.setAccount("ACCOUNT"); registry_1.setAccount("ACCOUNT");
registry_1.setAccountType(AccountType.Clrn.getKey()); registry_1.setAccountType(AccountType.Clrn.getKey());
registry_1.setDebit(BigDecimal.valueOf(22.2222222)); registry_1.setRegistryCode(RegistryCode.T.getKey());
registry_1.setCredit(BigDecimal.valueOf(44.4444444));
registryImdg.insert(registry_1); registryImdg.insert(registry_1);
Statement statement_1 = new Statement();
statement_1.setAddresseeId(COMPANY_ID);
statement_1.setAccount("ACCOUNT");
statement_1.setInOutDirection(InOutDirection.in.getKey());
statement_1.setInOutSDfType(InOutSDfType.type6.getKey());
statement_1.setOperationStatus(OperationStatus.Executed.getKey());
statement_1.setAmount(BigDecimal.valueOf(7777.777777777));
statement_1.setUpdated(Instant.now());
statementImdg.insert(statement_1);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -184,9 +192,10 @@ public class ReportServiceTest_KS {
File outFile = outFolder.listFiles()[0]; File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv").getFile()); 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")); compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME"));
registryImdg.delete(registry_1); registryImdg.delete(registry_1);
statementImdg.delete(statement_1);
} }
@Test @Test
@ -248,18 +257,27 @@ public class ReportServiceTest_KS {
Registry registry_1 = new Registry(); Registry registry_1 = new Registry();
registry_1.setCompanyId(COMPANY_ID); registry_1.setCompanyId(COMPANY_ID);
registry_1.setRegistryCode("AS__");
registry_1.setRegistryDesignation(RegistryDesignation.A.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_1.setSecuritySymbol("SECURITY_SYMBOL");
registry_1.setUpdated(Instant.now());
registry_1.setTradingCode("TRADING_CODE");
registry_1.setAccount("ACCOUNT"); registry_1.setAccount("ACCOUNT");
registry_1.setAccountType(AccountType.Depo.getKey()); registry_1.setAccountType(AccountType.Depo.getKey());
registry_1.setDebit(BigDecimal.valueOf(22.2222222)); registry_1.setRegistryCode(RegistryCode.T.getKey());
registry_1.setCredit(BigDecimal.valueOf(44.4444444));
registryImdg.insert(registry_1); registryImdg.insert(registry_1);
EquitySecurity equitySecurity = new EquitySecurity();
equitySecurity.setSecuritySymbol("value");
equitySecurity.setSecurityId(777L);
equitySecurityImdg.insert(equitySecurity);
Statement statement_1 = new Statement();
statement_1.setAddresseeId(COMPANY_ID);
statement_1.setAccount("ACCOUNT");
statement_1.setInOutDirection(InOutDirection.in.getKey());
statement_1.setInOutSDfType(InOutSDfType.type10.getKey());
statement_1.setOperationStatus(OperationStatus.Executed.getKey());
statement_1.setAmount(BigDecimal.valueOf(7777.777777777));
statement_1.setUpdated(Instant.now());
statement_1.setSecurityId(777L);
statementImdg.insert(statement_1);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -272,9 +290,11 @@ public class ReportServiceTest_KS {
File outFile = outFolder.listFiles()[0]; File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv").getFile()); 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")); compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME"));
registryImdg.delete(registry_1); registryImdg.delete(registry_1);
equitySecurityImdg.delete(equitySecurity);
statementImdg.delete(statement_1);
} }
@Test @Test
@ -560,15 +580,6 @@ public class ReportServiceTest_KS {
session_1.setClearingDate(LocalDate.now()); session_1.setClearingDate(LocalDate.now());
sessionImdg.insert(session_1); sessionImdg.insert(session_1);
Session session_2 = new Session();
session_2.setCreated(Instant.ofEpochSecond(3777777777L));
session_2.setUpdated(Instant.ofEpochSecond(4777777777L));
session_2.setSection(Section.FOND.getKey());
session_2.setSessionType(SessionType.IPO0.getKey());
session_2.setWorkflowStatus(WorkflowStatus.Blocked.getKey());
session_2.setClearingDate(LocalDate.now());
sessionImdg.insert(session_2);
ReportRequest reportRequest = new ReportRequest(); ReportRequest reportRequest = new ReportRequest();
reportRequest.setReportId(ReportBuilderType.KS_SESSION_LIST.getKey()); reportRequest.setReportId(ReportBuilderType.KS_SESSION_LIST.getKey());
@ -587,7 +598,6 @@ public class ReportServiceTest_KS {
compareCSVFiles(expectedFile, outFile, List.of("ID")); compareCSVFiles(expectedFile, outFile, List.of("ID"));
sessionImdg.delete(session_1); sessionImdg.delete(session_1);
sessionImdg.delete(session_2);
} }
@ -652,6 +662,8 @@ public class ReportServiceTest_KS {
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class); marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
} }
private void clearTestDir() throws IOException { private void clearTestDir() throws IOException {

View file

@ -1,3 +1,2 @@
"FIRMID","ACCOUNT","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE" "FIRMID","ACCOUNT","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE"
"TRADING_CODE","ACCOUNT","AM__","44.44","","2023-07-07" "1","ACCOUNT","T","7777.78","17:00:50","17.07.2023"
"TRADING_CODE","ACCOUNT","AM__","-22.22","","2023-07-07"

1 FIRMID ACCOUNT REGISTER_CODE ADD_SUM ADD_TIME ADD_DATE
2 TRADING_CODE 1 ACCOUNT AM__ T 44.44 7777.78 17:00:50 2023-07-07 17.07.2023
TRADING_CODE ACCOUNT AM__ -22.22 2023-07-07

View file

@ -1,3 +1,2 @@
"FIRMID","ACCOUNT","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE" "FIRMID","ACCOUNT","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE"
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","44.44","","07.07.2023" "1","ACCOUNT","value","T","7777.78","18:39:59","17.07.2023"
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","-22.22","","07.07.2023"

1 FIRMID ACCOUNT SECURITYID REGISTER_CODE ADD_QUANTITY ADD_TIME ADD_DATE
2 TRADING_CODE 1 ACCOUNT SECURITY_SYMBOL value AS__ T 44.44 7777.78 18:39:59 07.07.2023 17.07.2023
TRADING_CODE ACCOUNT SECURITY_SYMBOL AS__ -22.22 07.07.2023

View file

@ -1,3 +1,2 @@
"ID","CREATED_AT","UPDATED_AT","SESSION_DATE","SESSION_TYPE","WORKFLOW_STATUS" "ID","CREATED_AT","UPDATED_AT","SESSION_DATE","SESSION_TYPE","WORKFLOW_STATUS"
"2","03.05.2026T03:09:37","09.01.2058T04:56:17","MKR","FINL","ACTV" "2","03.05.2026T03:09:37","09.01.2058T04:56:17","MKR","FINL","ACTV"
"3","17.09.2089T06:42:57","27.05.2121T08:29:37","FOND","IPO0","BLKD"

1 ID CREATED_AT UPDATED_AT SESSION_DATE SESSION_TYPE WORKFLOW_STATUS
2 2 03.05.2026T03:09:37 09.01.2058T04:56:17 MKR FINL ACTV
3 17.09.2089T06:42:57 27.05.2121T08:29:37 FOND IPO0 BLKD

View file

@ -3,7 +3,14 @@ package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum InOutSDfType implements IEnumKey { public enum InOutSDfType implements IEnumKey {
type1("0102"), type6("0607"), type16("1617"), type9("0910"), type57("57"), type08("0809"); type1("0102"),
type6("0607"),
type16("1617"),
type9("0910"),
type57("57"),
type08("0809"),
type10("1011"),
;
private final String key; private final String key;

View file

@ -296,6 +296,15 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
return els.size() == 1 ? els.iterator().next() : null; return els.size() == 1 ? els.iterator().next() : null;
} }
@Override
public T getFirstObjectByPredicate(ImdgPredicate predicate) {
Collection<T> els = getCollectionObjectsByPredicate(predicate);
Iterator<T> iterator = els.iterator();
if (iterator.hasNext()) {
return iterator.next();
} else return null;
}
@Override @Override
public ImdgPredicateBuilder predicateBuilder() { public ImdgPredicateBuilder predicateBuilder() {
return ImdgPredicateBuilderHazelcast.instance(); return ImdgPredicateBuilderHazelcast.instance();

View file

@ -114,6 +114,11 @@ public interface Imdg<T extends SpcexObjectBase> {
throw new UnsupportedOperationException("not implemented getSingleObjectByPredicate"); throw new UnsupportedOperationException("not implemented getSingleObjectByPredicate");
} }
// Predicate API
default T getFirstObjectByPredicate(ImdgPredicate predicate) {
throw new UnsupportedOperationException("not implemented getFirstObjectByPredicate");
}
default ImdgPredicateBuilder predicateBuilder() { default ImdgPredicateBuilder predicateBuilder() {
throw new UnsupportedOperationException("not implemented predicateBuilder API"); throw new UnsupportedOperationException("not implemented predicateBuilder API");
} }