diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java index d79ec8cab..71aa51e9b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java @@ -8,6 +8,7 @@ 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; @@ -16,7 +17,6 @@ import java.io.File; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.HashMap; import java.util.Map; @@ -65,7 +65,7 @@ public class NTCRNotificationBuilder extends NotificationBuilder { Map valuesForTemplate = new HashMap<>(); - valuesForTemplate.put("${createdAt}", dateFormatter.format(createdAt.atZone(ZoneId.systemDefault()).toLocalDate())); + valuesForTemplate.put("${createdAt}", dateFormatter.format(createdAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate())); valuesForTemplate.put("${date}", LocalDate.now().format(dateFormatterYYMMDD)); valuesForTemplate.put("${TCRCode}", getNotNull(tradingClearingRegistry.getCode())); valuesForTemplate.put("${companyFullName}", getNotNull(company.getFullName())); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java index b09813c5d..4e78da5b1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java @@ -9,15 +9,13 @@ 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; import java.io.File; import java.time.Instant; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.TextStyle; import java.util.*; @Component @@ -79,7 +77,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(ZoneId.systemDefault()).toLocalDate())); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate())); String outputFilename = "ROOT.ACTV.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java index f16848526..948a9e45c 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java @@ -9,15 +9,13 @@ 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; import java.io.File; import java.time.Instant; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.TextStyle; import java.util.*; @Component @@ -79,7 +77,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(ZoneId.systemDefault()).toLocalDate())); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate())); String outputFilename = "ROOT.BLKD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java index eb009a49b..67992fbe6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java @@ -9,14 +9,13 @@ 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; import java.io.File; import java.time.Instant; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.TextStyle; import java.util.*; @Component @@ -78,7 +77,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(ZoneId.systemDefault()).toLocalDate())); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate())); String outputFilename = "ROOT.SSPD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java index 797d6cbfb..c482a37c3 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java @@ -9,14 +9,13 @@ 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; import java.io.File; import java.time.Instant; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.TextStyle; import java.util.*; @Component @@ -76,7 +75,7 @@ public class RRPCNotificationBuilder extends NotificationBuilder { Map valuesForTemplate = new HashMap<>(); fillHeaderValues(valuesForTemplate, notificationId); - valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(TimeUtil.getReportTimeZone()).toLocalDate())); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companyShortName}", company.getShortName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java index c74f48f5a..cb927b5bc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java @@ -159,8 +159,14 @@ public abstract class CSVReportBuilder { String[] headers = new String[this.getFieldMap().values().size()]; for (BeanField 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); - headers[positionAnnotation.position()] = nameAnnotation.column(); + if (positionAnnotation != null) { + headers[positionAnnotation.position()] = nameAnnotation.column(); + } + if (positionAnnotation2 != null) { + headers[positionAnnotation2.position()] = nameAnnotation.column(); + } } return headers; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bean/converter/InstantDateTimeDConverter.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bean/converter/InstantDateTimeDConverter.java new file mode 100644 index 000000000..20b337e80 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bean/converter/InstantDateTimeDConverter.java @@ -0,0 +1,34 @@ +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); + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java index 7ae648cbd..884cbd0f5 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java @@ -7,6 +7,7 @@ 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; @@ -79,7 +80,7 @@ public abstract class ExecutedDealReportBuilderCommon

extends CSVReportBuilde executedDealReport.setTradeDate(executionFond.getTradingDate()); if (executionFond.getExchangeExecutionTime() != null) - executedDealReport.setTradeTime(LocalDateTime.ofInstant(executionFond.getExchangeExecutionTime(), ZoneId.systemDefault())); + executedDealReport.setTradeTime(LocalDateTime.ofInstant(executionFond.getExchangeExecutionTime(), TimeUtil.getReportTimeZone())); executedDealReport.setSettleDate(executionFond.getSettlementDate()); executedDealReport.setSettleCode(executionFond.getSettlementCode()); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java index 9615a5ea1..4f60cb19f 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java @@ -8,6 +8,7 @@ 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; @@ -135,7 +136,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder