Skip to content
Snippets Groups Projects
Commit 3e4706fc authored by OZGCloud's avatar OZGCloud
Browse files

Merge branch 'master' into OZG-3929-spring-upgrade

# Conflicts:
#	goofy-client/pom.xml
#	goofy-server/pom.xml
parents fbbc26ef 0f533ab7
No related branches found
No related tags found
No related merge requests found
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.alfa.common;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.NonNull;
@Component
public class GermanDateTimeFormatter {
private static final DateTimeFormatter DATE_TIME_ZONE = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss z").withLocale(Locale.GERMANY);
@Autowired
private SystemProperties systemProperties;
public String formatZonedDateTime(@NonNull ZonedDateTime zonedDateTime) {
return DATE_TIME_ZONE.format(zonedDateTime.withZoneSameInstant(systemProperties.getTimeZone()));
}
}
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.alfa.common;
import java.time.ZoneId;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = SystemProperties.PREFIX)
public class SystemProperties {
static final String PREFIX = "ozgcloud.system";
/**
* Timezone to be used in application.
*/
private ZoneId timeZone = ZoneId.of("Europe/Berlin");
}
...@@ -26,8 +26,6 @@ package de.ozgcloud.alfa.postfach; ...@@ -26,8 +26,6 @@ package de.ozgcloud.alfa.postfach;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -40,6 +38,7 @@ import org.springframework.stereotype.Service; ...@@ -40,6 +38,7 @@ import org.springframework.stereotype.Service;
import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.errorhandling.TechnicalException;
import de.itvsh.kop.common.pdf.PdfService; import de.itvsh.kop.common.pdf.PdfService;
import de.ozgcloud.alfa.common.GermanDateTimeFormatter;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserProfile; import de.ozgcloud.alfa.common.user.UserProfile;
import de.ozgcloud.alfa.postfach.PostfachMail.Direction; import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
...@@ -56,11 +55,12 @@ class PostfachNachrichtPdfService { ...@@ -56,11 +55,12 @@ class PostfachNachrichtPdfService {
static final String FALLBACK_ANTRAGSTELLER_NAME = "Antragsteller"; static final String FALLBACK_ANTRAGSTELLER_NAME = "Antragsteller";
private static final DateTimeFormatter CREATED_AT_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss O").withLocale(Locale.GERMANY);
@Autowired @Autowired
private PdfService pdfService; private PdfService pdfService;
@Autowired
private GermanDateTimeFormatter germanDateTimeFormatter;
private boolean isFirstNachricht; private boolean isFirstNachricht;
@Value(PostfachNachrichtPdfService.PDF_TEMPLATE_PATH) @Value(PostfachNachrichtPdfService.PDF_TEMPLATE_PATH)
...@@ -111,7 +111,7 @@ class PostfachNachrichtPdfService { ...@@ -111,7 +111,7 @@ class PostfachNachrichtPdfService {
.isFirst(isFirstNachricht()) .isFirst(isFirstNachricht())
.subject(postfachMail.getSubject()) .subject(postfachMail.getSubject())
.mailBody(postfachMail.getMailBody()) .mailBody(postfachMail.getMailBody())
.createdAt(CREATED_AT_FORMATTER.format(postfachMail.getCreatedAt())) .createdAt(germanDateTimeFormatter.formatZonedDateTime(postfachMail.getCreatedAt()))
.createdBy(buildAbsenderName(postfachMail, antragsteller)) .createdBy(buildAbsenderName(postfachMail, antragsteller))
.attachments(postfachMail.getAttachmentNames()) .attachments(postfachMail.getAttachmentNames())
.build(); .build();
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
<xsl:template name="nachricht"> <xsl:template name="nachricht">
<fo:block font-size="11pt" margin-bottom="2mm"> <fo:block font-size="11pt" margin-bottom="2mm" linefeed-treatment="preserve">
<xsl:if test="isFirst='false'"> <xsl:if test="isFirst='false'">
<fo:leader leader-pattern="rule" leader-length="175mm" rule-style="solid" rule-thickness="1pt"/> <fo:leader leader-pattern="rule" leader-length="175mm" rule-style="solid" rule-thickness="1pt"/>
</xsl:if> </xsl:if>
......
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.alfa.common;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.mockito.InjectMocks;
import org.mockito.Mock;
class GermanDateTimeFormatterTest {
@Mock
private SystemProperties properties;
@InjectMocks
private GermanDateTimeFormatter germanDateTimeFormatter;
@ParameterizedTest
@MethodSource("provideDataForFormatZonedDateTime")
void shouldFormatZonedDateTime(ZonedDateTime date, String zoneId, String expected) {
when(properties.getTimeZone()).thenReturn(ZoneId.of(zoneId));
assertThat(germanDateTimeFormatter.formatZonedDateTime(date)).isEqualTo(expected);
}
private static Stream<Arguments> provideDataForFormatZonedDateTime() {
return Stream.of(
Arguments.of(zonedDateTime(2023, 9, 25, 10, "UTC"), "Europe/Berlin", "25.09.2023 12:00:00 MESZ"),
Arguments.of(zonedDateTime(2023, 9, 25, 23, "UTC"), "Europe/Berlin", "26.09.2023 01:00:00 MESZ"),
Arguments.of(zonedDateTime(2023, 12, 1, 10, "UTC"), "Europe/Berlin", "01.12.2023 11:00:00 MEZ"),
Arguments.of(zonedDateTime(2023, 9, 25, 10, "UTC"), "America/Los_Angeles", "25.09.2023 03:00:00 PDT"),
Arguments.of(zonedDateTime(2023, 9, 25, 4, "UTC"), "America/Los_Angeles", "24.09.2023 21:00:00 PDT"),
Arguments.of(zonedDateTime(2023, 12, 1, 10, "UTC"), "America/Los_Angeles", "01.12.2023 02:00:00 PST"),
Arguments.of(zonedDateTime(2023, 12, 1, 10, "America/Los_Angeles"), "Europe/Berlin", "01.12.2023 19:00:00 MEZ")
);
}
private static ZonedDateTime zonedDateTime(int year, int month, int dayOfMonth, int hour, String zoneID) {
return ZonedDateTime.of(year, month, dayOfMonth, hour, 0, 0, 0, ZoneId.of(zoneID));
}
}
...@@ -30,6 +30,8 @@ import static org.mockito.Mockito.*; ...@@ -30,6 +30,8 @@ import static org.mockito.Mockito.*;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -45,6 +47,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; ...@@ -45,6 +47,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserId;
import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
import de.ozgcloud.alfa.common.user.UserService; import de.ozgcloud.alfa.common.user.UserService;
import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory;
import de.ozgcloud.alfa.vorgang.EingangTestFactory; import de.ozgcloud.alfa.vorgang.EingangTestFactory;
import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
...@@ -118,6 +121,21 @@ class PostfachNachrichtPdfServiceITCase { ...@@ -118,6 +121,21 @@ class PostfachNachrichtPdfServiceITCase {
} }
} }
@DisplayName("Map Postfach-Nachricht")
@Nested
class TestMapPostfachNachricht {
private final ZonedDateTime createdAt = ZonedDateTime.of(2023, 9, 25, 10, 0, 0, 0, ZoneId.of("UTC"));
private final PostfachNachrichtPdfData pdfData = PostfachNachrichtPdfDataTestFactory.createBuilder().createdAt(createdAt).build();
@Test
void shouldMapCreatedAtWithCorrectTimezoneAndFormatting() {
var nachricht = service.mapPostfachNachricht(pdfData, AntragstellerTestFactory.create());
assertThat(nachricht.getCreatedAt()).isEqualTo("25.09.2023 12:00:00 MESZ");
}
}
private VorgangWithEingang buildVorgangAntragstellerNotSet() { private VorgangWithEingang buildVorgangAntragstellerNotSet() {
return VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()).build(); return VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()).build();
} }
......
...@@ -30,7 +30,6 @@ import static org.mockito.Mockito.*; ...@@ -30,7 +30,6 @@ import static org.mockito.Mockito.*;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.time.ZonedDateTime;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -46,6 +45,7 @@ import org.springframework.test.util.ReflectionTestUtils; ...@@ -46,6 +45,7 @@ import org.springframework.test.util.ReflectionTestUtils;
import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.errorhandling.TechnicalException;
import de.itvsh.kop.common.pdf.PdfService; import de.itvsh.kop.common.pdf.PdfService;
import de.ozgcloud.alfa.common.GermanDateTimeFormatter;
import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory;
import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
import de.ozgcloud.alfa.postfach.PostfachMail.Direction; import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
...@@ -62,6 +62,8 @@ class PostfachNachrichtPdfServiceTest { ...@@ -62,6 +62,8 @@ class PostfachNachrichtPdfServiceTest {
private PostfachNachrichtPdfService service; private PostfachNachrichtPdfService service;
@Mock @Mock
private PdfService pdfService; private PdfService pdfService;
@Mock
private GermanDateTimeFormatter germanDateTimeFormatter;
@DisplayName("Get all as pdf") @DisplayName("Get all as pdf")
@Nested @Nested
...@@ -239,17 +241,19 @@ class PostfachNachrichtPdfServiceTest { ...@@ -239,17 +241,19 @@ class PostfachNachrichtPdfServiceTest {
@Test @Test
void shouldMapNachrichtCreatedAt() { void shouldMapNachrichtCreatedAt() {
var expected = "formatted date";
when(germanDateTimeFormatter.formatZonedDateTime(PostfachMailTestFactory.CREATED_AT)).thenReturn(expected);
var nachricht = mapNachricht(); var nachricht = mapNachricht();
assertThat(nachricht.getCreatedAt()).isEqualTo("01.01.2000 01:00:00 GMT"); assertThat(nachricht.getCreatedAt()).isEqualTo(expected);
} }
@Test @Test
void shouldFormatTimeIn24hFormat() { void shouldCallDateFormatter() {
var pdfNachricht = mapNachricht( mapNachricht();
PostfachNachrichtPdfDataTestFactory.createBuilder().createdAt(ZonedDateTime.parse("2019-12-31T13:00:00Z")).build());
assertThat(pdfNachricht.getCreatedAt()).isEqualTo("31.12.2019 13:00:00 GMT"); verify(germanDateTimeFormatter).formatZonedDateTime(PostfachMailTestFactory.CREATED_AT);
} }
@Test @Test
......
...@@ -201,13 +201,11 @@ ...@@ -201,13 +201,11 @@
</goals> </goals>
<configuration> <configuration>
<outputDirectory> <outputDirectory>
${project.build.directory}/classes/META-INF/resources ${project.build.directory}/classes/META-INF/resources</outputDirectory>
</outputDirectory>
<resources> <resources>
<resource> <resource>
<directory> <directory>
../${project.parent.artifactId}-client/dist/apps/goofy/ ../${project.parent.artifactId}-client/dist/apps/goofy/</directory>
</directory>
</resource> </resource>
</resources> </resources>
</configuration> </configuration>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment