http://jira.mfd.msk:8088/browse/CLS-358 fix KSRepTrades and logs for KSRepDepoNetto
This commit is contained in:
parent
3b30b34a34
commit
c01f499648
4 changed files with 60 additions and 45 deletions
|
|
@ -33,7 +33,7 @@ public abstract class CSVReportBuilder<P, R> {
|
||||||
protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class);
|
protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class);
|
||||||
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
|
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
|
||||||
protected DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
|
protected DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
|
||||||
protected DateTimeFormatter dateFormatter_yyMMdd = DateTimeFormatter.ofPattern("yyMMdd");
|
protected DateTimeFormatter dateFormatter_yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Возвращает списком значения CSV отчета. Каждый элемент списка - строка, элемент массива внутри списка - столбец.
|
* Возвращает списком значения CSV отчета. Каждый элемент списка - строка, элемент массива внутри списка - столбец.
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
|
||||||
List<Registry> groupedRegistry = entry.getValue();
|
List<Registry> groupedRegistry = entry.getValue();
|
||||||
try {
|
try {
|
||||||
if (groupedRegistry.size() != 2) {
|
if (groupedRegistry.size() != 2) {
|
||||||
log.warn("Invalid OM_T and TM_T registries for GroupId = {} and SettlementDate = {}. Registries with id = [{}] was skipped",
|
log.warn("Invalid OS_T and TS_T registries for GroupId = {} and SettlementDate = {}. Registries with id = [{}] was skipped",
|
||||||
pairRegistryId.getGroupId(),
|
pairRegistryId.getGroupId(),
|
||||||
pairRegistryId.getSettlementDate(),
|
pairRegistryId.getSettlementDate(),
|
||||||
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
|
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
|
||||||
|
|
@ -99,7 +99,7 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tstRegistry == null || ostRegistry == null) {
|
if (tstRegistry == null || ostRegistry == null) {
|
||||||
log.warn("Invalid TM_T and OM_T registry pair, {} doubled. Registry pair was skipped", tstRegistry == null ? "OM_T" : "TM_T");
|
log.warn("Invalid TS_T and OS_T registry pair, {} doubled. Registry pair was skipped", tstRegistry == null ? "OS_T" : "TS_T");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.company.Company;
|
||||||
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
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.misc.Market;
|
||||||
import ru.clearing.classes.statics.data.misc.Session;
|
import ru.clearing.classes.statics.data.misc.Session;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
|
@ -24,6 +25,7 @@ import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
|
@ -33,6 +35,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
private final Imdg<ExecutionFond> executionFondImdg;
|
private final Imdg<ExecutionFond> executionFondImdg;
|
||||||
private final Imdg<Session> sessionImdg;
|
private final Imdg<Session> sessionImdg;
|
||||||
private final Imdg<Registry> registryImdg;
|
private final Imdg<Registry> registryImdg;
|
||||||
|
private final Imdg<Market> marketImdg;
|
||||||
private final Imdg<Company> companyImdg;
|
private final Imdg<Company> companyImdg;
|
||||||
|
|
||||||
private List<KSRepTradesReport> rows = null;
|
private List<KSRepTradesReport> rows = null;
|
||||||
|
|
@ -43,6 +46,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.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);
|
||||||
|
marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -121,12 +125,27 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
status = "1";
|
status = "1";
|
||||||
} else if (coverage == CoverageStatus.DNED) {
|
} else if (coverage == CoverageStatus.DNED) {
|
||||||
|
|
||||||
|
String marketCode = execution.getMarket();
|
||||||
|
Market market = marketImdg.getSingleObjectByFieldValues(Map.of(
|
||||||
|
"code",
|
||||||
|
marketCode
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if (market == null) {
|
||||||
|
log.warn(
|
||||||
|
"Broken execution (can't find market for market.code = {}). Execution (id = {}) skipped",
|
||||||
|
marketCode,
|
||||||
|
execution.getId()
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||||
String groupId = "%s%d%s".formatted(
|
String groupId = "%s%d%s".formatted(
|
||||||
dateFormatter_yyMMdd.format(nowDate),
|
dateFormatter_yyyyMMdd.format(nowDate),
|
||||||
execution.getExchangeExecutionId(),
|
execution.getExchangeExecutionId(),
|
||||||
execution.getMarket()
|
market.getId()
|
||||||
);
|
);
|
||||||
|
|
||||||
String sql = RegistryCodeSqlBuilder.getInstance(
|
String sql = RegistryCodeSqlBuilder.getInstance(
|
||||||
RegistryTradingParams.OS_T,
|
RegistryTradingParams.OS_T,
|
||||||
RegistryTradingParams.TS_T,
|
RegistryTradingParams.TS_T,
|
||||||
|
|
@ -148,30 +167,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Boolean fail = null;
|
boolean allNACCorNACK = checkRegistryStatus(registryCollection, List.of(RegistryStatus.NACK, RegistryStatus.NACC));
|
||||||
boolean brokenRegistries = false;
|
boolean allFAILorUNCV = checkRegistryStatus(registryCollection, List.of(RegistryStatus.FAIL, RegistryStatus.UNCV));
|
||||||
for (Registry registry : registryCollection) {
|
if (!allFAILorUNCV && !allNACCorNACK) {
|
||||||
if (registry.getRegistryStatus() == null) continue;
|
|
||||||
String regStatus = registry.getRegistryStatus();
|
|
||||||
|
|
||||||
if (regStatus.equals(RegistryStatus.NACK.getKey()) ||
|
|
||||||
regStatus.equals(RegistryStatus.NACC.getKey())) {
|
|
||||||
if (fail != null && fail) {
|
|
||||||
brokenRegistries = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fail = false;
|
|
||||||
} else if (regStatus.equals(RegistryStatus.FAIL.getKey()) ||
|
|
||||||
regStatus.equals(RegistryStatus.UNCV.getKey())) {
|
|
||||||
if (fail != null && !fail) {
|
|
||||||
brokenRegistries = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fail = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (brokenRegistries || fail == null) {
|
|
||||||
log.warn(
|
log.warn(
|
||||||
"Broken execution (invalid registry statuses). Registry for groupId = {} has invalid registry set. Id = [{}]. Execution (id = {}) skipped",
|
"Broken execution (invalid registry statuses). Registry for groupId = {} has invalid registry set. Id = [{}]. Execution (id = {}) skipped",
|
||||||
groupId,
|
groupId,
|
||||||
|
|
@ -181,19 +179,10 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fail) {
|
if (allFAILorUNCV) {
|
||||||
boolean allS = true;
|
boolean allS = checkRegistryInstrumentType(registryCollection, List.of(RegistryInstrumentType.S));
|
||||||
boolean allM = true;
|
boolean allM = checkRegistryInstrumentType(registryCollection, List.of(RegistryInstrumentType.M));
|
||||||
for (Registry registry : registryCollection) {
|
if (!allS && !allM) {
|
||||||
if (registry.getRegistryInstrumentType() == null) continue;
|
|
||||||
if (registry.getRegistryInstrumentType().equals(RegistryInstrumentType.S.getKey()))
|
|
||||||
allM = false;
|
|
||||||
if (registry.getRegistryInstrumentType().equals(RegistryInstrumentType.M.getKey()))
|
|
||||||
allS = false;
|
|
||||||
}
|
|
||||||
if (allS) status = "3";
|
|
||||||
if (allM) status = "2";
|
|
||||||
if (allS == allM) {
|
|
||||||
log.warn(
|
log.warn(
|
||||||
"Broken execution (different instrument types). Registry for groupId = {} has invalid registry set. Id = [{}]. Execution (id = {}) skipped",
|
"Broken execution (different instrument types). Registry for groupId = {} has invalid registry set. Id = [{}]. Execution (id = {}) skipped",
|
||||||
groupId,
|
groupId,
|
||||||
|
|
@ -202,6 +191,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
status = allS ? "3" : "2";
|
||||||
} else status = "0";
|
} else status = "0";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -214,4 +204,22 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean checkRegistryStatus(Collection<Registry> registries, Collection<RegistryStatus> registryStatuses) {
|
||||||
|
for (Registry registry : registries) {
|
||||||
|
RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus());
|
||||||
|
if (registryStatuses.contains(registryStatus)) continue;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkRegistryInstrumentType(Collection<Registry> registries, Collection<RegistryInstrumentType> RegistryInstrumentTypes) {
|
||||||
|
for (Registry registry : registries) {
|
||||||
|
RegistryInstrumentType RegistryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType());
|
||||||
|
if (RegistryInstrumentTypes.contains(RegistryInstrumentType)) continue;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ 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.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;
|
||||||
|
|
@ -63,13 +64,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
})
|
})
|
||||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
public class ReportServiceTest_KS {
|
public class ReportServiceTest_KS {
|
||||||
protected DateTimeFormatter dateFormatter_yyMMdd = DateTimeFormatter.ofPattern("yyMMdd");
|
protected DateTimeFormatter dateFormatter_yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");
|
||||||
private static File outFolder;
|
private static File outFolder;
|
||||||
private static int reportRequestCnt = 0;
|
private static int reportRequestCnt = 0;
|
||||||
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<Registry> registryImdg;
|
private Imdg<Registry> registryImdg;
|
||||||
|
private Imdg<Market> marketImdg;
|
||||||
private Imdg<Company> companyImdg;
|
private Imdg<Company> companyImdg;
|
||||||
private Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
|
private Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
|
||||||
private Imdg<ExecutionDeposit> executionDepositImdg;
|
private Imdg<ExecutionDeposit> executionDepositImdg;
|
||||||
|
|
@ -303,19 +305,23 @@ public class ReportServiceTest_KS {
|
||||||
executionFond.setCoverageStatus(CoverageStatus.ALWD.getKey());
|
executionFond.setCoverageStatus(CoverageStatus.ALWD.getKey());
|
||||||
executionFondImdg.insert(executionFond);
|
executionFondImdg.insert(executionFond);
|
||||||
|
|
||||||
|
Market market = new Market();
|
||||||
|
market.setCode("3333");
|
||||||
|
Long marketId = marketImdg.insert(market);
|
||||||
|
|
||||||
Registry registry = new Registry();
|
Registry registry = new Registry();
|
||||||
registry.setSessionId(sessionId_2);
|
registry.setSessionId(sessionId_2);
|
||||||
registry.setRegistryCode("OM_T");
|
registry.setRegistryCode("OM_T");
|
||||||
registry.setRegistryDesignation(RegistryDesignation.O.getKey());
|
registry.setRegistryDesignation(RegistryDesignation.O.getKey());
|
||||||
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
|
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
|
||||||
registry.setRegistryUnit(RegistryUnit.T.getKey());
|
registry.setRegistryUnit(RegistryUnit.T.getKey());
|
||||||
registry.setGroupId(Long.parseLong("%s%d%s".formatted(dateFormatter_yyMMdd.format(LocalDate.now()), 222, "333")));
|
registry.setGroupId(Long.parseLong("%s%d%d".formatted(dateFormatter_yyyyMMdd.format(LocalDate.now()), 222, marketId)));
|
||||||
registry.setRegistryStatus(RegistryStatus.FAIL.getKey());
|
registry.setRegistryStatus(RegistryStatus.FAIL.getKey());
|
||||||
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
|
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
|
||||||
registryImdg.insert(registry);
|
registryImdg.insert(registry);
|
||||||
|
|
||||||
ExecutionDeposit executionDeposit = new ExecutionDeposit();
|
ExecutionDeposit executionDeposit = new ExecutionDeposit();
|
||||||
executionDeposit.setMarket("333");
|
executionDeposit.setMarket("3333");
|
||||||
executionDeposit.setCompanyId(COMPANY_ID);
|
executionDeposit.setCompanyId(COMPANY_ID);
|
||||||
executionDeposit.setTradingDate(LocalDate.now());
|
executionDeposit.setTradingDate(LocalDate.now());
|
||||||
executionDeposit.setSessionId(sessionId_2);
|
executionDeposit.setSessionId(sessionId_2);
|
||||||
|
|
@ -599,6 +605,7 @@ public class ReportServiceTest_KS {
|
||||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearTestDir() throws IOException {
|
private void clearTestDir() throws IOException {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue