This commit is contained in:
akulikov 2023-09-07 13:57:13 +03:00
parent 37885e9879
commit 54d2183b45
17 changed files with 41 additions and 99 deletions

View file

@ -8,7 +8,6 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -65,7 +64,7 @@ public class NTCRNotificationBuilder extends NotificationBuilder {
Map<String, String> valuesForTemplate = new HashMap<>();
valuesForTemplate.put("${createdAt}", dateFormatter.format(createdAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate()));
valuesForTemplate.put("${createdAt}", dateFormatter.format(createdAt.atZone(getNotificationZoneId()).toLocalDate()));
valuesForTemplate.put("${date}", LocalDate.now().format(dateFormatterYYMMDD));
valuesForTemplate.put("${TCRCode}", getNotNull(tradingClearingRegistry.getCode()));
valuesForTemplate.put("${companyFullName}", getNotNull(company.getFullName()));

View file

@ -9,6 +9,7 @@ import ru.spcex.platform.imdg.api.Imdg;
import java.io.File;
import java.net.URL;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Collection;
@ -37,6 +38,10 @@ public abstract class NotificationBuilder {
return buildNotification(consumerId);
}
protected ZoneId getNotificationZoneId() {
return ZoneId.of("Europe/Moscow");
}
protected void fillHeaderValues(Map<String, String> valuesMap, Long notificationId) {
LocalDate notificationDate = LocalDate.now();
int day = notificationDate.getDayOfMonth();

View file

@ -9,7 +9,6 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -77,7 +76,7 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder {
valuesForTemplate.put("${companyFullName}", company.getFullName());
valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue());
valuesForTemplate.put("${companyClearingCode}", companyClearingCode);
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate()));
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(getNotificationZoneId()).toLocalDate()));
String outputFilename = "ROOT.ACTV.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now()));
outputFilename = normalizeFilenameForOS(outputFilename);

View file

@ -9,7 +9,6 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -77,7 +76,7 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder {
valuesForTemplate.put("${companyFullName}", company.getFullName());
valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue());
valuesForTemplate.put("${companyClearingCode}", companyClearingCode);
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate()));
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(getNotificationZoneId()).toLocalDate()));
String outputFilename = "ROOT.BLKD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now()));
outputFilename = normalizeFilenameForOS(outputFilename);

View file

@ -9,7 +9,6 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -77,7 +76,7 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder {
valuesForTemplate.put("${companyFullName}", company.getFullName());
valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue());
valuesForTemplate.put("${companyClearingCode}", companyClearingCode);
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate()));
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(getNotificationZoneId()).toLocalDate()));
String outputFilename = "ROOT.SSPD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now()));
outputFilename = normalizeFilenameForOS(outputFilename);

View file

@ -9,7 +9,6 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -75,7 +74,7 @@ public class RRPCNotificationBuilder extends NotificationBuilder {
Map<String, String> valuesForTemplate = new HashMap<>();
fillHeaderValues(valuesForTemplate, notificationId);
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate()));
valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(getNotificationZoneId()).toLocalDate()));
valuesForTemplate.put("${companyFullName}", company.getFullName());
valuesForTemplate.put("${companyShortName}", company.getShortName());
valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue());

View file

@ -23,6 +23,7 @@ import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -43,6 +44,13 @@ public abstract class CSVReportBuilder<P, R> {
*/
protected abstract List<R> getRows();
/**
* Временной пояс для отчета
*/
protected ZoneId getReportZoneId() {
return ZoneId.of("Europe/Moscow");
}
/**
* Название отчета, используется для формирования имени отчета (без указания формата)
*
@ -79,7 +87,7 @@ public abstract class CSVReportBuilder<P, R> {
/**
* Формирование отчета на основе параметров
*
* @param params Параметры формирования отчета
* @param params Параметры формирования отчета
*/
protected abstract void collect(P params);
@ -88,7 +96,7 @@ public abstract class CSVReportBuilder<P, R> {
*
* @param file Файл отчета
* @return Созданный CSVWriter
*
* <p>
* todo check it
*/
protected ICSVWriter createCsvWriter(File file) throws IOException {
@ -153,20 +161,13 @@ public abstract class CSVReportBuilder<P, R> {
}
static class CustomStrategy<T> extends ColumnPositionMappingStrategy<T> {
@Override
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
super.generateHeader(bean);
String[] headers = new String[this.getFieldMap().values().size()];
for (BeanField<T, Integer> field : this.getFieldMap().values()) {
CsvBindByPosition positionAnnotation = field.getField().getAnnotation(CsvBindByPosition.class);
CsvCustomBindByPosition positionAnnotation2 = field.getField().getAnnotation(CsvCustomBindByPosition.class);
CsvBindByName nameAnnotation = field.getField().getAnnotation(CsvBindByName.class);
if (positionAnnotation != null) {
headers[positionAnnotation.position()] = nameAnnotation.column();
}
if (positionAnnotation2 != null) {
headers[positionAnnotation2.position()] = nameAnnotation.column();
}
headers[positionAnnotation.position()] = nameAnnotation.column();
}
return headers;
}
@ -190,7 +191,7 @@ public abstract class CSVReportBuilder<P, R> {
formatValue,
writeFormat);
}
return csvConverter;
return csvConverter;
}
}

View file

@ -1,34 +0,0 @@
package ru.spcex.clearing.reports.reports.bean.converter;
import com.opencsv.bean.AbstractBeanField;
import com.opencsv.exceptions.CsvConstraintViolationException;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import ru.spcex.clearing.reports.util.TimeUtil;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
/**
* see @CsvCustomBindByPosition(position = 5, converter = LocalTimeConverter.class)
* see @CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
* dd.MM.yyyy'T'HH:mm:ss
*/
public class InstantDateTimeDConverter extends AbstractBeanField {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss")
.withLocale(Locale.getDefault())
.withZone(TimeUtil.getReportTimeZone());
@Override
protected Object convert(String s) throws CsvDataTypeMismatchException, CsvConstraintViolationException {
Instant parse = Instant.from(formatter.parse(s)); // not tested
return parse;
}
@Override
protected String convertToWrite(Object value) throws CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
if (value == null) return "";
return formatter.format((Instant) value);
}
}

View file

@ -7,7 +7,6 @@ import ru.clearing.classes.statics.data.misc.Session;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.bean.ExecutedDealReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
@ -15,7 +14,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
@ -80,7 +78,7 @@ public abstract class ExecutedDealReportBuilderCommon<P> extends CSVReportBuilde
executedDealReport.setTradeDate(executionFond.getTradingDate());
if (executionFond.getExchangeExecutionTime() != null)
executedDealReport.setTradeTime(LocalDateTime.ofInstant(executionFond.getExchangeExecutionTime(), TimeUtil.getReportTimeZone()));
executedDealReport.setTradeTime(LocalDateTime.ofInstant(executionFond.getExchangeExecutionTime(), getReportZoneId()));
executedDealReport.setSettleDate(executionFond.getSettlementDate());
executedDealReport.setSettleCode(executionFond.getSettlementCode());

View file

@ -158,19 +158,20 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
continue;
}
String tradeNum = extractPartAgreementNumber(String.valueOf(omtRegistry.getGroupId()));
if (tradeNum == null) {
log.warn("Can't extract ExchangeExecutionId from GroupId (groupId = {} for OM_T registry id = {}). " +
"Registry id = {} skipped",
omtRegistry.getGroupId(),
omtRegistry.getId(),
registry.getId());
continue;
}
// String tradeNum = extractPartAgreementNumber(String.valueOf(omtRegistry.getGroupId()));
// if (tradeNum == null) {
// log.warn("Can't extract TradeNum from GroupId (groupId = {} for OM_T registry id = {}). " +
// "Registry id = {} skipped",
// omtRegistry.getGroupId(),
// omtRegistry.getId(),
// registry.getId());
// continue;
// }
String agreementNumber = registry.getContract();
if (agreementNumber != null && agreementNumber.contains("~"))
agreementNumber = agreementNumber.substring(0, agreementNumber.indexOf("~"));
String agreementNumberPostfix = registry.getContract();
if (agreementNumberPostfix != null && !agreementNumberPostfix.contains("~"))
agreementNumberPostfix = "";

View file

@ -8,7 +8,6 @@ import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.PairRegistryId;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.reports.reports.bean.KSRepCashNettoReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -19,7 +18,6 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@ -136,7 +134,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
ksRepCashNettoReport.setSessionId(registry.getSessionId());
if (session != null && session.getCreated() != null)
ksRepCashNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), TimeUtil.getReportTimeZone()));
ksRepCashNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
ksRepCashNettoReport.setAccount(registry.getAccount());
ksRepCashNettoReport.setDate(nowDate);

View file

@ -8,7 +8,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSRepCashRegisterSumsReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -123,7 +122,7 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
ksRepCashRegisterSumsReport.setTkr(registry.getTradingClearingRegistry());
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode());
ksRepCashRegisterSumsReport.setAddDate(nowDate);
ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(statement.getUpdated(), TimeUtil.getReportTimeZone()));
ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(statement.getUpdated(), getReportZoneId()));
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
if (inOutDirection == InOutDirection.in) {

View file

@ -8,7 +8,6 @@ import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.PairRegistryId;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.reports.reports.bean.KSRepDepoNettoReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -19,7 +18,6 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@ -135,7 +133,7 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
Session session = sessionImdg.getSingleObjectByID(registry.getSessionId());
if (session != null && session.getCreated() != null)
ksRepDepoNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), TimeUtil.getReportTimeZone()));
ksRepDepoNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
BigDecimal tstBalance = BigDecimal.ZERO;
BigDecimal ostBalance = BigDecimal.ZERO;

View file

@ -12,7 +12,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSRepDepoRegisterQuantitiesReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -145,7 +144,7 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
ksRepDepoRegisterQuantitiesReport.setSecurityId(security.getSecuritySymbol());
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate);
ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(statement.getUpdated(), TimeUtil.getReportTimeZone()));
ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(statement.getUpdated(), getReportZoneId()));
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
if (inOutDirection == InOutDirection.in) {

View file

@ -13,7 +13,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSRepTradesReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -24,7 +23,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@ -122,7 +120,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
if (execution.getSessionId() != null) {
Session session = sessionImdg.getSingleObjectByID(execution.getSessionId());
if (session != null && session.getCreated() != null)
ksRepTradesReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), TimeUtil.getReportTimeZone()));
ksRepTradesReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
} else {
log.info("Execution id = {} was skipped: session_id is null", execution.getId());
continue;
@ -142,7 +140,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
ksRepTradesReport.setClassCode(execution.getMarket());
if (execution.getExchangeExecutionTime() != null)
ksRepTradesReport.setTradeDate(LocalDateTime.ofInstant(execution.getExchangeExecutionTime(), TimeUtil.getReportTimeZone()));
ksRepTradesReport.setTradeDate(LocalDateTime.ofInstant(execution.getExchangeExecutionTime(), getReportZoneId()));
String status = "0";
if (execution.getCoverageStatus() != null) {

View file

@ -6,7 +6,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSSessionListReport;
import ru.spcex.clearing.reports.util.TimeUtil;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.imdg.api.Imdg;
@ -14,7 +13,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@ -64,9 +62,9 @@ public class KSSessionListReportBuilder extends CSVReportBuilder<EmptyParams, KS
KSSessionListReport ksSessionListReport = new KSSessionListReport();
ksSessionListReport.setId(session.getId());
if (session.getCreated() != null)
ksSessionListReport.setCreatedAt(LocalDateTime.ofInstant(session.getCreated(), TimeUtil.getReportTimeZone()));
ksSessionListReport.setCreatedAt(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
if (session.getUpdated() != null)
ksSessionListReport.setUpdatedAt(LocalDateTime.ofInstant(session.getUpdated(), TimeUtil.getReportTimeZone()));
ksSessionListReport.setUpdatedAt(LocalDateTime.ofInstant(session.getUpdated(), getReportZoneId()));
ksSessionListReport.setSection(session.getSection());
ksSessionListReport.setSessionType(session.getSessionType());
ksSessionListReport.setWorkflowStatus(session.getWorkflowStatus());

View file

@ -1,14 +0,0 @@
package ru.spcex.clearing.reports.util;
import java.time.ZoneId;
import java.util.Locale;
public class TimeUtil {
public static Locale getLocale() {
return Locale.getDefault();
}
public static ZoneId getReportTimeZone() {
return ZoneId.of("Europe/Moscow"); // В Петербурге используется часовой пояс Europe/Moscow UTC+3
}
}