diff --git a/.gitignore b/.gitignore index 5f52dbb0..20b93aab 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,6 @@ atlassian-ide-plugin.xml # OSX .DS_Store -/.nb-gradle/private/ \ No newline at end of file +/.nb-gradle/private/ +/bin/ +.classpath diff --git a/build.gradle b/build.gradle index 6d499b30..38d8fb0e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,7 @@ apply plugin: 'java' apply plugin: 'war' +apply plugin: 'eclipse' +apply plugin: 'eclipse-wtp' apply plugin: 'sonar-runner' sourceCompatibility = 1.8 @@ -7,8 +9,10 @@ version = '1.0' project.ext { springVersion = '4.0.5.RELEASE' springSecurityVersion = '3.2.3.RELEASE' + jacksonVersion ='2.4.2' } compileJava.options.encoding = 'UTF-8' +eclipse.classpath.downloadJavadoc = true repositories { mavenCentral() @@ -47,8 +51,8 @@ dependencies { //web compile "org.springframework:spring-webmvc:$project.springVersion" - compile "com.fasterxml.jackson.core:jackson-databind:2.3.1" - compile "org.codehaus.jackson:jackson-core-asl:1.9.13" + compile "com.fasterxml.jackson.core:jackson-databind:$project.jacksonVersion" + compile "com.fasterxml.jackson.core:jackson-core:$project.jacksonVersion" compile "javax.servlet:jstl:1.2" compile "org.springframework.data:spring-data-rest-webmvc:2.1.0.RELEASE" compile "org.webjars:bootstrap:3.1.1" @@ -80,7 +84,7 @@ dependencies { compile "postgresql:postgresql:9.1-901.jdbc4" compile "org.springframework.data:spring-data-jpa:1.6.0.RELEASE" compile "org.springframework:spring-orm:$project.springVersion" - compile "org.hibernate:hibernate-entitymanager:4.1.8.Final" + compile "org.hibernate:hibernate-entitymanager:4.3.6.Final" compile "org.hibernate:hibernate-validator:4.3.1.Final" //needed because java 8 compability compile "org.javassist:javassist:3.18.1-GA" @@ -97,6 +101,7 @@ dependencies { testCompile("org.echocat.jomon:testing:1.4.3") { exclude group: "org.mockito" } + testCompile "org.hamcrest:hamcrest-all:1.3" testCompile "org.mockito:mockito-core:1.9.5" testCompile "com.jayway.jsonpath:json-path:0.9.1" } diff --git a/src/main/java/de/techdev/trackr/core/security/AccessConfirmationController.java b/src/main/java/de/techdev/trackr/core/security/AccessConfirmationController.java index d650859d..6657ba12 100644 --- a/src/main/java/de/techdev/trackr/core/security/AccessConfirmationController.java +++ b/src/main/java/de/techdev/trackr/core/security/AccessConfirmationController.java @@ -5,7 +5,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; import java.security.Principal; import java.util.Map; diff --git a/src/main/java/de/techdev/trackr/core/web/api/ApiWebMvcConfiguration.java b/src/main/java/de/techdev/trackr/core/web/api/ApiWebMvcConfiguration.java index 95e30342..3ddf5d2d 100644 --- a/src/main/java/de/techdev/trackr/core/web/api/ApiWebMvcConfiguration.java +++ b/src/main/java/de/techdev/trackr/core/web/api/ApiWebMvcConfiguration.java @@ -1,26 +1,14 @@ package de.techdev.trackr.core.web.api; -import de.techdev.trackr.core.web.converters.DateConverter; -import de.techdev.trackr.domain.ApiBeansConfiguration; -import de.techdev.trackr.domain.common.StringToEntityConverter; -import de.techdev.trackr.domain.common.TrackrUserLocaleResolver; -import de.techdev.trackr.domain.company.Address; -import de.techdev.trackr.domain.company.Company; -import de.techdev.trackr.domain.company.ContactPerson; -import de.techdev.trackr.domain.employee.Employee; -import de.techdev.trackr.domain.employee.expenses.TravelExpense; -import de.techdev.trackr.domain.employee.expenses.reports.Report; -import de.techdev.trackr.domain.employee.expenses.reports.comments.Comment; -import de.techdev.trackr.domain.employee.login.Authority; -import de.techdev.trackr.domain.employee.login.Credential; -import de.techdev.trackr.domain.employee.sickdays.SickDays; -import de.techdev.trackr.domain.employee.vacation.VacationRequest; -import de.techdev.trackr.domain.project.billtimes.BillableTime; -import de.techdev.trackr.domain.project.Project; -import de.techdev.trackr.domain.project.worktimes.WorkTime; -import de.techdev.trackr.domain.project.invoice.Invoice; +import java.time.LocalDate; +import java.util.List; + import org.springframework.context.MessageSource; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.Import; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.support.ConfigurableConversionService; @@ -37,7 +25,29 @@ import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import java.util.List; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.techdev.trackr.core.web.converters.DateConverter; +import de.techdev.trackr.core.web.converters.LocalDateConverter; +import de.techdev.trackr.core.web.converters.TimePropertiesToJson; +import de.techdev.trackr.domain.ApiBeansConfiguration; +import de.techdev.trackr.domain.common.StringToEntityConverter; +import de.techdev.trackr.domain.common.TrackrUserLocaleResolver; +import de.techdev.trackr.domain.company.Address; +import de.techdev.trackr.domain.company.Company; +import de.techdev.trackr.domain.company.ContactPerson; +import de.techdev.trackr.domain.employee.Employee; +import de.techdev.trackr.domain.employee.expenses.TravelExpense; +import de.techdev.trackr.domain.employee.expenses.reports.Report; +import de.techdev.trackr.domain.employee.expenses.reports.comments.Comment; +import de.techdev.trackr.domain.employee.login.Authority; +import de.techdev.trackr.domain.employee.login.Credential; +import de.techdev.trackr.domain.employee.sickdays.SickDays; +import de.techdev.trackr.domain.employee.vacation.VacationRequest; +import de.techdev.trackr.domain.project.Project; +import de.techdev.trackr.domain.project.billtimes.BillableTime; +import de.techdev.trackr.domain.project.invoice.Invoice; +import de.techdev.trackr.domain.project.worktimes.WorkTime; /** * @author Moritz Schulze @@ -69,12 +79,15 @@ protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration public EntityLinks entityLinks() { return new RepositoryEntityLinksWithoutProjection(repositories(), resourceMappings(), config(), pageableResolver(), backendIdConverterRegistry()); } - + + @Bean public LocaleResolver localeResolver() { return new TrackrUserLocaleResolver(); } + + @Bean public ExceptionHandlers exceptionHandlers() { return new ExceptionHandlers(); @@ -84,6 +97,11 @@ public ExceptionHandlers exceptionHandlers() { public DateConverter dateConverter() { return new DateConverter(); } + + @Bean + public Converter localDateConverter() { + return new LocalDateConverter(); + } @Bean public Converter stringInvoiceConverter() { @@ -109,6 +127,7 @@ public Converter employeeConverter() { protected void configureConversionService(ConfigurableConversionService conversionService) { super.configureConversionService(conversionService); conversionService.addConverter(dateConverter()); + conversionService.addConverter(localDateConverter()); } /** @@ -116,6 +135,7 @@ protected void configureConversionService(ConfigurableConversionService conversi */ @Override public void addFormatters(FormatterRegistry registry) { + registry.addConverter(localDateConverter()); registry.addConverter(dateConverter()); registry.addConverter(stringInvoiceConverter()); registry.addConverter(vacationRequestConverter()); @@ -153,6 +173,18 @@ protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEv validatingListener.addValidator("beforeCreate", validator()); } + + @Override + protected void configureJacksonObjectMapper(ObjectMapper objectMapper) { + super.configureJacksonObjectMapper(objectMapper); + objectMapper.registerModule(localDateTimeModule()); + } + + @Bean + public TimePropertiesToJson localDateTimeModule() { + return new TimePropertiesToJson(); + } + /** * Custom validator that extracts messages with locale. Used by spring-data-rest. */ diff --git a/src/main/java/de/techdev/trackr/core/web/converters/JsonModuleSupport.java b/src/main/java/de/techdev/trackr/core/web/converters/JsonModuleSupport.java new file mode 100644 index 00000000..c304c04f --- /dev/null +++ b/src/main/java/de/techdev/trackr/core/web/converters/JsonModuleSupport.java @@ -0,0 +1,109 @@ +package de.techdev.trackr.core.web.converters; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + + +public class JsonModuleSupport extends SimpleModule { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public interface SerializeInterface { + public void serialize(T value, JsonGenerator jgen, + SerializerProvider provider) throws IOException, + JsonGenerationException; + } + + public interface DeserializerInterface { + public T deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException, JsonProcessingException; + } + + public JsonModuleSupport() { + super(); + } + + public JsonModuleSupport(String name) { + super(name); + } + + public JsonModuleSupport(Version version) { + super(version); + } + + public JsonModuleSupport(String name, Version version) { + super(name, version); + } + + public JsonModuleSupport(String name, Version version, + Map, JsonDeserializer> deserializers) { + super(name, version, deserializers); + } + + public JsonModuleSupport(String name, Version version, + List> serializers) { + super(name, version, serializers); + } + + public JsonModuleSupport(String name, Version version, + Map, JsonDeserializer> deserializers, + List> serializers) { + super(name, version, deserializers, serializers); + } + + public void addSerializer(Class type, SerializeInterface serializer) { + addSerializer(translateToSerializer(type, serializer)); + } + + public void addDeserializer(Class type, DeserializerInterface deserializer) { + addDeserializer(type, translateToDeserializer(type, deserializer)); + } + + private JsonSerializer translateToSerializer(Class type, SerializeInterface serializer) { + return new StdSerializer(type) { + + @Override + public void serialize(T value, JsonGenerator jgen, + SerializerProvider provider) throws IOException, + JsonGenerationException { + serializer.serialize(value, jgen, provider); + + } + }; + } + + private JsonDeserializer translateToDeserializer(Class type, DeserializerInterface deserializer) { + return new StdDeserializer(type) { + + /** + * auto generated + */ + private static final long serialVersionUID = 1L; + + @Override + public T deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + return deserializer.deserialize(jp, ctxt); + } + + }; + } + +} \ No newline at end of file diff --git a/src/main/java/de/techdev/trackr/core/web/converters/LocalDateConverter.java b/src/main/java/de/techdev/trackr/core/web/converters/LocalDateConverter.java new file mode 100644 index 00000000..b317a3e7 --- /dev/null +++ b/src/main/java/de/techdev/trackr/core/web/converters/LocalDateConverter.java @@ -0,0 +1,58 @@ +package de.techdev.trackr.core.web.converters; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +import org.springframework.core.convert.converter.Converter; + +/** + * A {@link java.util.Date} converter that supports the formats yyyy-MM-dd and yyyy-MM-dd HH:mm:ss. + * + * @author Moritz Schulze + */ +public class LocalDateConverter implements Converter { + + private DateTimeFormatter date10; + + private DateTimeFormatter date19; + + public LocalDateConverter() { + date10 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + date19 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + } + + @Override + public LocalDate convert(String source) { + if(source == null) { + return null; + } + LocalDate date; + try { + Long milliSeconds = Long.valueOf(source); + Instant instant = Instant.ofEpochMilli(milliSeconds); + return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate(); + } catch (NumberFormatException e) { + //Continue with other formats + } + if(source.length() == 10) { + try { + date = LocalDate.parse(source,date10); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException(String.format("%s is not a valid yyyy-MM-dd date.", source)); + } + } else if(source.length() == 19) { + try { + date = LocalDate.parse(source,date19); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException(String.format("%s is not a valid yyyy-MM-dd HH:mm:ss date.", source)); + } + } else { + throw new IllegalArgumentException(String.format("%s is not convertible by this Date converter", source)); + } + return date; + } +} diff --git a/src/main/java/de/techdev/trackr/core/web/converters/TimePropertiesToJson.java b/src/main/java/de/techdev/trackr/core/web/converters/TimePropertiesToJson.java new file mode 100644 index 00000000..0383f48d --- /dev/null +++ b/src/main/java/de/techdev/trackr/core/web/converters/TimePropertiesToJson.java @@ -0,0 +1,70 @@ +package de.techdev.trackr.core.web.converters; + +import static java.time.format.DateTimeFormatter.ISO_INSTANT; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_TIME; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalTime; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.fasterxml.jackson.core.Version; + +public class TimePropertiesToJson extends JsonModuleSupport { + + @Autowired + LocalDateConverter localDateConverter; + + /** + * auto generated + */ + private static final long serialVersionUID = 1L; + + + public TimePropertiesToJson() { + super("TimeSerialisation", new Version(1, 0, 0, "SNAPSHOT", + "de.techdev", "trackr")); + + addLocalDateSupport(); + addLocalTimeSupport(); + addInstantSupport(); + } + + private void addLocalDateSupport() { + addSerializer(LocalDate.class, (value, jgen, provider) -> { + jgen.writeString(value.toString()); + }); + addDeserializer(LocalDate.class, (jp, ctxt) -> { + String dateAsString = jp.readValueAs(String.class); + return localDateConverter.convert(dateAsString); + }); + } + + private void addLocalTimeSupport() { + addSerializer(LocalTime.class, (v, jgen, provider) -> { + + String formatted = v.format(ISO_LOCAL_TIME); + jgen.writeString(formatted); + }); + addDeserializer(LocalTime.class, (jp, ctxt) -> { + String dateAsString = jp.readValueAs(String.class); + return ISO_LOCAL_TIME.parse(dateAsString, + LocalTime::from); + }); + } + + private void addInstantSupport() { + addSerializer(Instant.class, (v, jgen, provider) -> { + + String formatted = ISO_INSTANT.format(v); + jgen.writeString(formatted); + }); + addDeserializer(Instant.class, (jp, ctxt) -> { + String dateAsString = jp.readValueAs(String.class); + return ISO_INSTANT.parse(dateAsString,Instant::from); + }); + + } + +} diff --git a/src/main/java/de/techdev/trackr/domain/converter/InstantDatabaseConverter.java b/src/main/java/de/techdev/trackr/domain/converter/InstantDatabaseConverter.java new file mode 100644 index 00000000..19c10db7 --- /dev/null +++ b/src/main/java/de/techdev/trackr/domain/converter/InstantDatabaseConverter.java @@ -0,0 +1,22 @@ +package de.techdev.trackr.domain.converter; + +import java.sql.Timestamp; +import java.time.Instant; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter(autoApply=true) +public class InstantDatabaseConverter implements AttributeConverter { + + @Override + public Timestamp convertToDatabaseColumn(Instant attribute) { + return attribute == null ? null: Timestamp.from(attribute); + } + + @Override + public Instant convertToEntityAttribute(Timestamp dbData) { + return dbData == null ? null : dbData.toInstant(); + } + +} diff --git a/src/main/java/de/techdev/trackr/domain/converter/LocalDateDatabaseConverter.java b/src/main/java/de/techdev/trackr/domain/converter/LocalDateDatabaseConverter.java new file mode 100644 index 00000000..81fb7b6b --- /dev/null +++ b/src/main/java/de/techdev/trackr/domain/converter/LocalDateDatabaseConverter.java @@ -0,0 +1,22 @@ +package de.techdev.trackr.domain.converter; + +import java.sql.Date; +import java.time.LocalDate; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter(autoApply=true) +public class LocalDateDatabaseConverter implements AttributeConverter { + + @Override + public Date convertToDatabaseColumn(LocalDate attribute) { + return attribute == null ? null: Date.valueOf(attribute); + } + + @Override + public LocalDate convertToEntityAttribute(Date dbData) { + return dbData == null ? null : dbData.toLocalDate(); + } + +} \ No newline at end of file diff --git a/src/main/java/de/techdev/trackr/domain/converter/LocalTimeDatabaseConverter.java b/src/main/java/de/techdev/trackr/domain/converter/LocalTimeDatabaseConverter.java new file mode 100644 index 00000000..86e77f03 --- /dev/null +++ b/src/main/java/de/techdev/trackr/domain/converter/LocalTimeDatabaseConverter.java @@ -0,0 +1,22 @@ +package de.techdev.trackr.domain.converter; + +import java.sql.Time; +import java.time.LocalTime; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter(autoApply=true) +public class LocalTimeDatabaseConverter implements AttributeConverter { + + @Override + public Time convertToDatabaseColumn(LocalTime attribute) { + return attribute == null ? null: Time.valueOf(attribute); + } + + @Override + public LocalTime convertToEntityAttribute(Time dbData) { + return dbData == null ? null : dbData.toLocalTime(); + } + +} \ No newline at end of file diff --git a/src/main/java/de/techdev/trackr/domain/employee/Employee.java b/src/main/java/de/techdev/trackr/domain/employee/Employee.java index 3205bc0e..3f2bda85 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/Employee.java +++ b/src/main/java/de/techdev/trackr/domain/employee/Employee.java @@ -1,6 +1,7 @@ package de.techdev.trackr.domain.employee; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import de.techdev.trackr.domain.common.FederalState; import de.techdev.trackr.domain.employee.expenses.reports.Report; import de.techdev.trackr.domain.employee.login.Credential; @@ -10,13 +11,15 @@ import de.techdev.trackr.domain.validation.constraints.EndAfterBegin; import lombok.Data; import lombok.ToString; + import org.hibernate.validator.constraints.NotEmpty; import javax.persistence.*; import javax.validation.constraints.NotNull; + import java.math.BigDecimal; +import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; /** @@ -51,11 +54,9 @@ public class Employee { private BigDecimal hourlyCostRate; - @Temporal(TemporalType.DATE) - private Date joinDate; + private LocalDate joinDate; - @Temporal(TemporalType.DATE) - private Date leaveDate; + private LocalDate leaveDate; @Enumerated(EnumType.STRING) @NotNull diff --git a/src/main/java/de/techdev/trackr/domain/employee/EmployeeEventHandler.java b/src/main/java/de/techdev/trackr/domain/employee/EmployeeEventHandler.java index 1e16a443..e6925aca 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/EmployeeEventHandler.java +++ b/src/main/java/de/techdev/trackr/domain/employee/EmployeeEventHandler.java @@ -1,7 +1,6 @@ package de.techdev.trackr.domain.employee; import de.techdev.trackr.domain.employee.login.Credential; -import de.techdev.trackr.util.LocalDateUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.rest.core.annotation.*; import org.springframework.security.access.prepost.PreAuthorize; @@ -32,7 +31,7 @@ protected void deactivateEmployeeIfNecessary(Employee employee) { // enabled can be null (was needed for TRACKR-20) if(employee.getLeaveDate() != null && employee.getCredential().getEnabled() != null && employee.getCredential().getEnabled()) { LocalDate today = LocalDate.now(); - LocalDate leaveDate = LocalDateUtil.fromDate(employee.getLeaveDate()); + LocalDate leaveDate = employee.getLeaveDate(); if(leaveDate.isBefore(today) || leaveDate.equals(today)) { log.info("Deactivating employee {}", employee); employee.getCredential().setEnabled(false); diff --git a/src/main/java/de/techdev/trackr/domain/employee/EmployeeRepository.java b/src/main/java/de/techdev/trackr/domain/employee/EmployeeRepository.java index 615af3d9..ebcda98b 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/EmployeeRepository.java +++ b/src/main/java/de/techdev/trackr/domain/employee/EmployeeRepository.java @@ -1,6 +1,7 @@ package de.techdev.trackr.domain.employee; import de.techdev.trackr.domain.common.FederalState; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -10,7 +11,7 @@ import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; +import java.time.LocalDate; import java.util.List; /** @@ -40,7 +41,7 @@ public interface EmployeeRepository extends JpaRepository { @RestResource(exported = false) @PreAuthorize("hasRole('ROLE_ADMIN')") - List findByLeaveDateAndCredential_Enabled(Date leaveDate, Boolean credentialEnabled); + List findByLeaveDateAndCredential_Enabled(LocalDate leaveDate, Boolean credentialEnabled); @RestResource(exported = false) List findByFederalState(FederalState berlin); diff --git a/src/main/java/de/techdev/trackr/domain/employee/EmployeeWithCredentialProjection.java b/src/main/java/de/techdev/trackr/domain/employee/EmployeeWithCredentialProjection.java index 9cbb2461..48e6b82f 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/EmployeeWithCredentialProjection.java +++ b/src/main/java/de/techdev/trackr/domain/employee/EmployeeWithCredentialProjection.java @@ -2,10 +2,11 @@ import de.techdev.trackr.domain.common.FederalState; import de.techdev.trackr.domain.employee.login.Credential; + import org.springframework.data.rest.core.config.Projection; import java.math.BigDecimal; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -28,9 +29,9 @@ public interface EmployeeWithCredentialProjection { BigDecimal getHourlyCostRate(); - Date getJoinDate(); + LocalDate getJoinDate(); - Date getLeaveDate(); + LocalDate getLeaveDate(); FederalState getFederalState(); diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/TravelExpense.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/TravelExpense.java index a168e3e6..919d5ba0 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/TravelExpense.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/TravelExpense.java @@ -7,8 +7,10 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; + import java.math.BigDecimal; -import java.util.Date; +import java.time.Instant; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -45,16 +47,13 @@ public static enum Type { private BigDecimal vat; @NotNull - @Temporal(TemporalType.DATE) - private Date fromDate; + private LocalDate fromDate; @NotNull - @Temporal(TemporalType.DATE) - private Date toDate; + private LocalDate toDate; @NotNull - @Temporal(TemporalType.TIMESTAMP) - private Date submissionDate; + private Instant submissionDate; private String comment; } diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Projections.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Projections.java index 77e09b62..fb799218 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Projections.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Projections.java @@ -4,9 +4,10 @@ import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.employee.expenses.TravelExpense; import de.techdev.trackr.domain.project.Project; + import org.springframework.data.rest.core.config.Projection; -import java.util.Date; +import java.time.Instant; import java.util.List; /** @@ -23,9 +24,9 @@ public static interface TravelExpenseReportForOverviewProjection { List getExpenses(); - Date getSubmissionDate(); + Instant getSubmissionDate(); - Date getApprovalDate(); + Instant getApprovalDate(); Employee getApprover(); @@ -46,7 +47,7 @@ public static interface TravelExpenseReportWithEmployeeAndTravelExpensesProjecti Report.Status getStatus(); - Date getSubmissionDate(); + Instant getSubmissionDate(); } @Projection(types = Report.class, name = "withExpensesAndDebitor") @@ -59,9 +60,9 @@ public static interface TravelExpenseReportWithExpensesAndDebitorProjection { Report.Status getStatus(); - Date getSubmissionDate(); + Instant getSubmissionDate(); - Date getApprovalDate(); + Instant getApprovalDate(); Company getDebitor(); } @@ -77,7 +78,7 @@ public static interface TravelExpenseReportWithTravelExpensesProjection { Report.Status getStatus(); - Date getSubmissionDate(); + Instant getSubmissionDate(); Company getDebitor(); diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Report.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Report.java index 5c333d2c..c2276229 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Report.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/Report.java @@ -10,8 +10,9 @@ import lombok.ToString; import javax.persistence.*; + +import java.time.Instant; import java.util.ArrayList; -import java.util.Date; import java.util.List; /** @@ -43,12 +44,9 @@ public static enum Status { @Enumerated(EnumType.STRING) private Status status; + private Instant submissionDate; - @Temporal(TemporalType.TIMESTAMP) - private Date submissionDate; - - @Temporal(TemporalType.TIMESTAMP) - private Date approvalDate; + private Instant approvalDate; @ManyToOne private Employee approver; diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportController.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportController.java index 96508894..c2368d16 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportController.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportController.java @@ -3,6 +3,7 @@ import de.techdev.trackr.core.pdf.PdfCreationException; import de.techdev.trackr.core.pdf.PdfRenderer; import de.techdev.trackr.domain.employee.expenses.TravelExpense; + import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -15,7 +16,7 @@ import java.math.BigDecimal; import java.security.Principal; -import java.util.Date; +import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -64,12 +65,12 @@ public ResponseEntity asPdf(@PathVariable("id") Report travelExpenseRepo Context ctx = new Context(); ctx.setVariable("report", report); - ctx.setVariable("today", new Date()); + ctx.setVariable("today", LocalDate.now()); List expenses = report.getExpenses(); BigDecimal totalCost = expenses.stream().map(TravelExpense::getCost).reduce(BigDecimal.ZERO, (b1, b2) -> b1.add(b2)); ctx.setVariable("totalCost", totalCost); - Optional startDate = expenses.stream().map(TravelExpense::getFromDate).min(Date::compareTo); - Optional endDate = expenses.stream().map(TravelExpense::getToDate).max(Date::compareTo); + Optional startDate = expenses.stream().map(TravelExpense::getFromDate).min(LocalDate::compareTo); + Optional endDate = expenses.stream().map(TravelExpense::getToDate).max(LocalDate::compareTo); if (startDate.isPresent()) { ctx.setVariable("startDate", startDate.get()); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportRepository.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportRepository.java index 4003749f..8dd301ec 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportRepository.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportRepository.java @@ -1,6 +1,7 @@ package de.techdev.trackr.domain.employee.expenses.reports; import de.techdev.trackr.domain.employee.Employee; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; @@ -10,7 +11,7 @@ import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; +import java.time.Instant; import java.util.List; /** @@ -34,6 +35,6 @@ public interface ReportRepository extends CrudRepository { Page findByStatusOrderByEmployee_LastNameAsc(@Param("status") Report.Status status, Pageable pageable); @PreAuthorize("hasRole('ROLE_ADMIN')") - List findBySubmissionDateBetween(@Param("start") Date start, @Param("end") Date end); + List findBySubmissionDateBetween(@Param("start") Instant start, @Param("end") Instant end); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportService.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportService.java index 9ac3f626..874ec29c 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/ReportService.java @@ -2,11 +2,12 @@ import de.techdev.trackr.domain.employee.login.Credential; import de.techdev.trackr.domain.employee.login.CredentialRepository; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; +import java.time.Instant; /** * @author Moritz Schulze @@ -41,11 +42,11 @@ public Report reject(Report travelExpenseReport, String rejecterName) { private Report setStatusOnTravelExpenseReport(Report travelExpenseReport, Report.Status status, String approverName) { if (status == Report.Status.SUBMITTED) { - travelExpenseReport.setSubmissionDate(new Date()); + travelExpenseReport.setSubmissionDate(Instant.now()); } else { Credential approver = credentialRepository.findByEmail(approverName); travelExpenseReport.setApprover(approver.getEmployee()); - travelExpenseReport.setApprovalDate(new Date()); + travelExpenseReport.setApprovalDate(Instant.now()); } travelExpenseReport.setStatus(status); return travelExpenseReportRepository.save(travelExpenseReport); diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/Comment.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/Comment.java index 20a4c986..566a29ad 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/Comment.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/Comment.java @@ -3,11 +3,13 @@ import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.employee.expenses.reports.Report; import lombok.Data; + import org.hibernate.validator.constraints.NotEmpty; import javax.persistence.*; import javax.validation.constraints.NotNull; -import java.util.Date; + +import java.time.Instant; /** * @author Moritz Schulze @@ -25,8 +27,7 @@ public class Comment { private String text; @NotNull - @Temporal(TemporalType.TIMESTAMP) - private Date submissionDate; + private Instant submissionDate; @ManyToOne @NotNull diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentEventHandler.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentEventHandler.java index ee1f1408..2a306054 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentEventHandler.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentEventHandler.java @@ -1,10 +1,11 @@ package de.techdev.trackr.domain.employee.expenses.reports.comments; import lombok.extern.slf4j.Slf4j; + import org.springframework.data.rest.core.annotation.*; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; +import java.time.Instant; /** * @author Moritz Schulze @@ -16,7 +17,7 @@ public class CommentEventHandler { @HandleBeforeCreate @PreAuthorize("hasRole('ROLE_SUPERVISOR') or #comment.employee.id == principal?.id") public void checkCreateAuthority(Comment comment) { - comment.setSubmissionDate(new Date()); + comment.setSubmissionDate(Instant.now()); log.debug("Creating comment {}", comment); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentWithEmployeeProjection.java b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentWithEmployeeProjection.java index 5e5f1299..46fec8b8 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentWithEmployeeProjection.java +++ b/src/main/java/de/techdev/trackr/domain/employee/expenses/reports/comments/CommentWithEmployeeProjection.java @@ -1,9 +1,10 @@ package de.techdev.trackr.domain.employee.expenses.reports.comments; import de.techdev.trackr.domain.employee.Employee; + import org.springframework.data.rest.core.config.Projection; -import java.util.Date; +import java.time.Instant; /** * @author Moritz Schulze @@ -14,7 +15,7 @@ public interface CommentWithEmployeeProjection { String getText(); - Date getSubmissionDate(); + Instant getSubmissionDate(); Employee getEmployee(); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/login/DeactivateEmployeesService.java b/src/main/java/de/techdev/trackr/domain/employee/login/DeactivateEmployeesService.java index 9c4ba7a3..24624438 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/login/DeactivateEmployeesService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/login/DeactivateEmployeesService.java @@ -4,7 +4,6 @@ import de.techdev.trackr.core.security.RemoveTokenService; import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.employee.EmployeeRepository; -import de.techdev.trackr.util.LocalDateUtil; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +32,7 @@ public class DeactivateEmployeesService { */ @Transactional public void deactivateEmployeesWithLeaveDateToday() { - List employeesToDeactivate = employeeRepository.findByLeaveDateAndCredential_Enabled(LocalDateUtil.fromLocalDate(LocalDate.now()), true); + List employeesToDeactivate = employeeRepository.findByLeaveDateAndCredential_Enabled(LocalDate.now(), true); employeesToDeactivate.forEach(employee -> { log.info("Deactivating employee {}", employee); employee.getCredential().setEnabled(false); diff --git a/src/main/java/de/techdev/trackr/domain/employee/login/support/SupervisorService.java b/src/main/java/de/techdev/trackr/domain/employee/login/support/SupervisorService.java index dca68904..95ad9d42 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/login/support/SupervisorService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/login/support/SupervisorService.java @@ -1,6 +1,5 @@ package de.techdev.trackr.domain.employee.login.support; -import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.employee.login.Authority; import de.techdev.trackr.domain.employee.login.AuthorityRepository; import de.techdev.trackr.domain.employee.login.Credential; diff --git a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDays.java b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDays.java index 54fdce88..4d87abe9 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDays.java +++ b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDays.java @@ -6,7 +6,8 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; -import java.util.Date; + +import java.time.LocalDate; /** * @author Moritz Schulze @@ -27,11 +28,9 @@ public class SickDays { @NotNull private Employee employee; - @Temporal(TemporalType.DATE) @NotNull - private Date startDate; + private LocalDate startDate; - @Temporal(TemporalType.DATE) - private Date endDate; + private LocalDate endDate; } diff --git a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysNotifyService.java b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysNotifyService.java index 2c4cc8ee..b66bfaf5 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysNotifyService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysNotifyService.java @@ -1,11 +1,13 @@ package de.techdev.trackr.domain.employee.sickdays; +import static java.time.format.DateTimeFormatter.ofPattern; import de.techdev.trackr.core.mail.MailService; import de.techdev.trackr.domain.employee.login.support.SupervisorService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; -import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; /** * @author Moritz Schulze @@ -17,20 +19,19 @@ public class SickDaysNotifyService { @Autowired private SupervisorService supervisorService; + DateTimeFormatter GERMAN_DATE_FORMAT = ofPattern("dd.MM.yyyy"); public void notifySupervisorsAboutNew(SickDays sickDays) { - SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); String subject = "Sick days reported by " + sickDays.getEmployee().fullName(); - String text = sickDays.getEmployee().fullName() + " reported sick days from " + sdf.format(sickDays.getStartDate()) - + " to " + (sickDays.getEndDate() != null ? sdf.format(sickDays.getEndDate()) : " (not set)" ) + "."; + String text = sickDays.getEmployee().fullName() + " reported sick days from " + GERMAN_DATE_FORMAT.format(sickDays.getStartDate()) + + " to " + (sickDays.getEndDate() != null ? GERMAN_DATE_FORMAT.format(sickDays.getEndDate()) : " (not set)" ) + "."; notifySupervisors(subject, text); } public void notifySupervisorsAboutUpdate(SickDays sickDays) { - SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); String subject = "Sick days updated by " + sickDays.getEmployee().fullName(); - String text = sickDays.getEmployee().fullName() + " updated his sick days. Interval is now from " + sdf.format(sickDays.getStartDate()) - + " to " + (sickDays.getEndDate() != null ? sdf.format(sickDays.getEndDate()) : " (not set)") + "."; + String text = sickDays.getEmployee().fullName() + " updated his sick days. Interval is now from " + GERMAN_DATE_FORMAT.format(sickDays.getStartDate()) + + " to " + (sickDays.getEndDate() != null ? GERMAN_DATE_FORMAT.format(sickDays.getEndDate()) : " (not set)") + "."; notifySupervisors(subject, text); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysRepository.java b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysRepository.java index 1bf6403d..a0b9856d 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysRepository.java +++ b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysRepository.java @@ -1,6 +1,7 @@ package de.techdev.trackr.domain.employee.sickdays; import de.techdev.trackr.domain.employee.Employee; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,7 +11,7 @@ import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; +import java.time.LocalDate; import java.util.List; /** @@ -32,10 +33,10 @@ public interface SickDaysRepository extends JpaRepository { @PreAuthorize("hasRole('ROLE_ADMIN')") List findByStartDateBetweenOrEndDateBetween( - @Param("startLower") Date startLower, - @Param("startHigher") Date startHigher, - @Param("endLower") Date endLower, - @Param("endHigher") Date endHigher + @Param("startLower") LocalDate startLower, + @Param("startHigher") LocalDate startHigher, + @Param("endLower") LocalDate endLower, + @Param("endHigher") LocalDate endHigher ); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysWithEmployeeProjection.java b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysWithEmployeeProjection.java index 8ad6b015..26d00af6 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysWithEmployeeProjection.java +++ b/src/main/java/de/techdev/trackr/domain/employee/sickdays/SickDaysWithEmployeeProjection.java @@ -1,9 +1,10 @@ package de.techdev.trackr.domain.employee.sickdays; import de.techdev.trackr.domain.employee.Employee; + import org.springframework.data.rest.core.config.Projection; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -16,7 +17,7 @@ public interface SickDaysWithEmployeeProjection { Employee getEmployee(); - Date getStartDate(); + LocalDate getStartDate(); - Date getEndDate(); + LocalDate getEndDate(); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/Holiday.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/Holiday.java index 95a4fd2d..175509ed 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/Holiday.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/Holiday.java @@ -4,7 +4,8 @@ import lombok.Data; import javax.persistence.*; -import java.util.Date; + +import java.time.LocalDate; /** * @author Moritz Schulze @@ -17,8 +18,7 @@ public class Holiday { @GeneratedValue(strategy = GenerationType.AUTO) private Long id; - @Temporal(TemporalType.DATE) - private Date day; + private LocalDate day; private String name; diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayCalculator.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayCalculator.java index 9ca65a36..35ab5c63 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayCalculator.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayCalculator.java @@ -1,12 +1,10 @@ package de.techdev.trackr.domain.employee.vacation; import de.techdev.trackr.domain.common.FederalState; -import de.techdev.trackr.util.LocalDateUtil; import org.springframework.beans.factory.annotation.Autowired; import java.time.DayOfWeek; import java.time.LocalDate; -import java.util.Date; import java.util.List; import static java.util.stream.Collectors.toList; @@ -19,11 +17,12 @@ public class HolidayCalculator { @Autowired private HolidayRepository holidayRepository; - public Integer calculateDifferenceBetweenExcludingHolidaysAndWeekends(Date start, Date end, FederalState federalState) { + public Integer calculateDifferenceBetweenExcludingHolidaysAndWeekends(LocalDate start, LocalDate end, FederalState federalState) { List holidays = holidayRepository.findByFederalStateAndDayBetween(federalState, start, end); - return calculateDifferenceBetweenExcludingHolidaysAndWeekends(LocalDateUtil.fromDate(start), LocalDateUtil.fromDate(end), holidays.stream() - .map(holiday -> LocalDateUtil.fromDate(holiday.getDay())) - .collect(toList())); + return calculateDifferenceBetweenExcludingHolidaysAndWeekends(start, end, + holidays.stream() + .map(Holiday::getDay) + .collect(toList())); } protected Integer calculateDifferenceBetweenExcludingHolidaysAndWeekends(LocalDate start, LocalDate end, List holidays) { diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayRepository.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayRepository.java index 4b2e9358..11f2ef54 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayRepository.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/HolidayRepository.java @@ -1,12 +1,12 @@ package de.techdev.trackr.domain.employee.vacation; import de.techdev.trackr.domain.common.FederalState; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.data.rest.core.annotation.RestResource; -import java.util.Date; +import java.time.LocalDate; import java.util.List; /** @@ -22,6 +22,6 @@ public interface HolidayRepository extends CrudRepository { @RestResource(exported = false) void delete(Long id); - List findByFederalStateAndDayBetween(@Param("state") FederalState federalState, @Param("start") Date start, @Param("end") Date end); + List findByFederalStateAndDayBetween(@Param("state") FederalState federalState, @Param("start") LocalDate start, @Param("end") LocalDate end); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequest.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequest.java index 9af16389..f9c76e33 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequest.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequest.java @@ -1,6 +1,7 @@ package de.techdev.trackr.domain.employee.vacation; import com.fasterxml.jackson.annotation.JsonIgnore; + import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.validation.constraints.EndAfterBegin; import lombok.Data; @@ -8,7 +9,9 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; -import java.util.Date; + +import java.time.Instant; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -34,24 +37,20 @@ public static enum VacationRequestStatus { @NotNull private Employee employee; - @Temporal(TemporalType.DATE) @NotNull - private Date startDate; + private LocalDate startDate; - @Temporal(TemporalType.DATE) @NotNull - private Date endDate; + private LocalDate endDate; private Integer numberOfDays; @Enumerated(EnumType.STRING) private VacationRequestStatus status; - @Temporal(TemporalType.TIMESTAMP) - private Date approvalDate; + private Instant approvalDate; - @Temporal(TemporalType.TIMESTAMP) - private Date submissionTime; + private Instant submissionTime; @ManyToOne private Employee approver; diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveService.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveService.java index c35205d4..664d10f3 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveService.java @@ -5,14 +5,15 @@ import de.techdev.trackr.domain.employee.login.Credential; import de.techdev.trackr.domain.employee.login.CredentialRepository; import de.techdev.trackr.domain.employee.vacation.support.VacationRequestNotifyService; -import de.techdev.trackr.util.LocalDateUtil; import lombok.extern.slf4j.Slf4j; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; +import java.time.Instant; import java.time.LocalDate; -import java.util.Date; +import java.time.ZoneId; import java.util.List; /** @@ -61,8 +62,8 @@ public VacationRequest reject(VacationRequest vacationRequest, String supervisor @Transactional @PreAuthorize("hasRole('ROLE_ADMIN')") public void approveSevenDayOldRequests() { - LocalDate oneWeekAgo = LocalDate.now().minusDays(7); - List vacationRequests = vacationRequestRepository.findBySubmissionTimeBeforeAndStatus(LocalDateUtil.fromLocalDate(oneWeekAgo), VacationRequest.VacationRequestStatus.PENDING); + Instant oneWeekAgo = LocalDate.now().minusDays(7).atStartOfDay(ZoneId.systemDefault()).toInstant(); + List vacationRequests = vacationRequestRepository.findBySubmissionTimeBeforeAndStatus(oneWeekAgo, VacationRequest.VacationRequestStatus.PENDING); vacationRequests.forEach(vacationRequest -> { log.info("Approving more then seven days old vacation request {}", vacationRequest); approve(vacationRequest, null); @@ -78,7 +79,7 @@ protected VacationRequest setStatusOnVacationRequest(VacationRequest vacationReq } vacationRequest.setStatus(status); vacationRequest.setApprover(supervisor); - vacationRequest.setApprovalDate(new Date()); + vacationRequest.setApprovalDate(Instant.now()); vacationRequest = vacationRequestRepository.save(vacationRequest); vacationRequestNotifyService.sendEmailNotification(vacationRequest); diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestController.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestController.java index 6b880269..7417b8eb 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestController.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestController.java @@ -2,6 +2,7 @@ import de.techdev.trackr.domain.employee.vacation.support.VacationRequestEmployeeToDaysTotalService; import lombok.extern.slf4j.Slf4j; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; @@ -9,7 +10,7 @@ import org.springframework.web.bind.annotation.*; import java.security.Principal; -import java.util.Date; +import java.time.LocalDate; import java.util.Map; /** @@ -69,8 +70,8 @@ public VacationRequest reject(@PathVariable("id") VacationRequest vacationReques @RequestMapping(value = "/daysPerEmployeeBetween", method = RequestMethod.GET, produces = "application/hal+json") @ResponseStatus(HttpStatus.OK) public Map daysPerEmployeeBetween( - @RequestParam("start") Date start, - @RequestParam("end") Date end + @RequestParam("start") LocalDate start, + @RequestParam("end") LocalDate end ) { return vacationRequestEmployeeToDaysTotalService.mapVacationRequestsToTotalDays(start, end); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestEventHandler.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestEventHandler.java index 5f3b4121..ffd01f10 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestEventHandler.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestEventHandler.java @@ -3,11 +3,12 @@ import de.techdev.trackr.domain.common.UuidMapper; import de.techdev.trackr.domain.employee.vacation.support.VacationRequestNotifyService; import lombok.extern.slf4j.Slf4j; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.core.annotation.*; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; +import java.time.Instant; import java.util.UUID; /** @@ -36,7 +37,7 @@ public void prepareVacationRequest(VacationRequest vacationRequest) { vacationRequest.setStatus(VacationRequest.VacationRequestStatus.PENDING); vacationRequest.setApprover(null); vacationRequest.setApprovalDate(null); - vacationRequest.setSubmissionTime(new Date()); + vacationRequest.setSubmissionTime(Instant.now()); log.debug("Creating vacation request {}", vacationRequest); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepository.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepository.java index 18a1fd53..0ae0ffcc 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepository.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepository.java @@ -1,13 +1,15 @@ package de.techdev.trackr.domain.employee.vacation; import de.techdev.trackr.domain.employee.Employee; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; +import java.time.Instant; +import java.time.LocalDate; import java.util.List; /** @@ -30,14 +32,14 @@ public interface VacationRequestRepository extends CrudRepository findByStatusOrderBySubmissionTimeAsc(@Param("status") VacationRequest.VacationRequestStatus status); @RestResource(exported = false) - List findBySubmissionTimeBeforeAndStatus(Date date, VacationRequest.VacationRequestStatus status); + List findBySubmissionTimeBeforeAndStatus(Instant date, VacationRequest.VacationRequestStatus status); /** * Find vacation requests of a certain status that overlap with a period. */ @RestResource(exported = false) List findByStartDateBetweenOrEndDateBetweenAndStatus( - Date startLower, Date startHigher, - Date endLower, Date endHigher, + LocalDate startLower, LocalDate startHigher, + LocalDate endLower, LocalDate endHigher, VacationRequest.VacationRequestStatus status); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestWithEmployeeAndApproverProjection.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestWithEmployeeAndApproverProjection.java index b2bc007c..9c58bf29 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestWithEmployeeAndApproverProjection.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/VacationRequestWithEmployeeAndApproverProjection.java @@ -1,9 +1,11 @@ package de.techdev.trackr.domain.employee.vacation; import de.techdev.trackr.domain.employee.Employee; + import org.springframework.data.rest.core.config.Projection; -import java.util.Date; +import java.time.Instant; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -14,17 +16,17 @@ public interface VacationRequestWithEmployeeAndApproverProjection { Employee getEmployee(); - Date getStartDate(); + LocalDate getStartDate(); - Date getEndDate(); + LocalDate getEndDate(); Integer getNumberOfDays(); VacationRequest.VacationRequestStatus getStatus(); - Date getApprovalDate(); - - Date getSubmissionTime(); + Instant getApprovalDate(); + + Instant getSubmissionTime(); Employee getApprover(); } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalService.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalService.java index d7be8d9e..aa880de7 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalService.java @@ -3,9 +3,10 @@ import de.techdev.trackr.domain.employee.vacation.HolidayCalculator; import de.techdev.trackr.domain.employee.vacation.VacationRequest; import de.techdev.trackr.domain.employee.vacation.VacationRequestRepository; + import org.springframework.beans.factory.annotation.Autowired; -import java.util.Date; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.function.ToIntFunction; @@ -29,7 +30,7 @@ public class VacationRequestEmployeeToDaysTotalService { * @param end The end of the period * @return A map of employee names to days of vacation in between start and end. */ - public Map mapVacationRequestsToTotalDays(Date start, Date end) { + public Map mapVacationRequestsToTotalDays(LocalDate start, LocalDate end) { List vacationRequests = vacationRequestRepository .findByStartDateBetweenOrEndDateBetweenAndStatus(start, end, start, end, VacationRequest.VacationRequestStatus.APPROVED); return mapToEmployeesAndSumUp(vacationRequests, vacationRequest -> getVacationDaysBetween(vacationRequest, start, end)); @@ -53,7 +54,7 @@ protected Map mapToEmployeesAndSumUp(List vaca /** * @return Returns the number of days of the vacation request between start and end that aren't holidays or weekends. */ - protected Integer getVacationDaysBetween(VacationRequest vacationRequest, Date start, Date end) { + protected Integer getVacationDaysBetween(VacationRequest vacationRequest, LocalDate start, LocalDate end) { return holidayCalculator.calculateDifferenceBetweenExcludingHolidaysAndWeekends( // If the start of the vacation request is before the desired period we use the period start getMaximum(start, vacationRequest.getStartDate()), @@ -66,14 +67,14 @@ protected Integer getVacationDaysBetween(VacationRequest vacationRequest, Date s /** * The minimum of the two dates. No null checks. */ - protected Date getMinimum(Date a, Date b) { - return a.before(b) ? a : b; + protected LocalDate getMinimum(LocalDate a, LocalDate b) { + return a.isBefore(b) ? a : b; } /** * The maximum of the two dates. No null checks. */ - protected Date getMaximum(Date a, Date b) { - return a.before(b) ? b : a; + protected LocalDate getMaximum(LocalDate a, LocalDate b) { + return a.isBefore(b) ? b : a; } } diff --git a/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestNotifyService.java b/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestNotifyService.java index b837c77e..4b4e16bc 100644 --- a/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestNotifyService.java +++ b/src/main/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestNotifyService.java @@ -1,12 +1,14 @@ package de.techdev.trackr.domain.employee.vacation.support; +import static java.time.format.DateTimeFormatter.ofPattern; import de.techdev.trackr.core.mail.MailService; import de.techdev.trackr.domain.employee.login.support.SupervisorService; import de.techdev.trackr.domain.employee.vacation.VacationRequest; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; -import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; import java.util.UUID; /** @@ -14,6 +16,8 @@ */ public class VacationRequestNotifyService { + DateTimeFormatter GERMAN_DATE_FORMAT = ofPattern("dd.MM.yyyy"); + @Autowired private MailService mailService; @@ -55,11 +59,10 @@ protected String getStatusMailText(VacationRequest request) { * Send a new vacation request notification to all supervisors. */ public void notifySupervisors(VacationRequest vacationRequest, UUID uuid) { - SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); String[] receiver = supervisorService.getSupervisorEmailsAsArray(); SimpleMailMessage mailMessage = new SimpleMailMessage(); String subject = "New vacation request from " + vacationRequest.getEmployee().fullName() + "; " + uuid.toString(); - String text = "New vacation request from " + vacationRequest.getEmployee().fullName() + " for " + sdf.format(vacationRequest.getStartDate()) + " - " + sdf + String text = "New vacation request from " + vacationRequest.getEmployee().fullName() + " for " + GERMAN_DATE_FORMAT.format(vacationRequest.getStartDate()) + " - " + GERMAN_DATE_FORMAT .format(vacationRequest.getEndDate()) + ". You can reply to this email with approve or reject to do that."; mailMessage.setSubject(subject); mailMessage.setTo(receiver); diff --git a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTime.java b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTime.java index ebe292fa..feeebeb7 100644 --- a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTime.java +++ b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTime.java @@ -1,14 +1,23 @@ package de.techdev.trackr.domain.project.billtimes; -import de.techdev.trackr.domain.employee.Employee; -import de.techdev.trackr.domain.project.Project; -import lombok.Data; -import lombok.ToString; - -import javax.persistence.*; +import java.time.LocalDate; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; +import javax.persistence.Version; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import java.util.Date; + +import lombok.Data; +import lombok.ToString; +import de.techdev.trackr.domain.employee.Employee; +import de.techdev.trackr.domain.project.Project; /** * @author Moritz Schulze @@ -37,8 +46,7 @@ public class BillableTime { private Project project; @NotNull - @Temporal(TemporalType.DATE) - private Date date; + private LocalDate date; @NotNull @Min(0) diff --git a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeController.java b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeController.java index eee30916..ce04c350 100644 --- a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeController.java +++ b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeController.java @@ -1,6 +1,12 @@ package de.techdev.trackr.domain.project.billtimes; -import de.techdev.trackr.domain.project.Project; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.summingInt; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.convert.ConversionService; @@ -12,12 +18,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.summingInt; +import de.techdev.trackr.domain.project.Project; /** * @author Moritz Schulze @@ -37,8 +38,8 @@ public class BillableTimeController { @ResponseBody @RequestMapping(value = "/findEmployeeMappingByProjectAndDateBetween", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public Map findEmployeeMappingByProjectAndDateBetween(@RequestParam("project") String projectId, - @RequestParam("start") Date start, - @RequestParam("end") Date end) { + @RequestParam("start") LocalDate start, + @RequestParam("end") LocalDate end) { Project project = conversionService.convert(Long.valueOf(projectId), Project.class); List billableTimes = billableTimeRepository.findByProjectAndDateBetweenOrderByDateAsc(project, start, end); return billableTimes.stream().collect(groupingBy(bt -> bt.getEmployee().fullName(), summingInt(BillableTime::getMinutes))); diff --git a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeRepository.java b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeRepository.java index 5dfee8ba..830a9bff 100644 --- a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeRepository.java +++ b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeRepository.java @@ -1,13 +1,14 @@ package de.techdev.trackr.domain.project.billtimes; -import de.techdev.trackr.domain.project.Project; +import java.time.LocalDate; +import java.util.List; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; -import java.util.List; +import de.techdev.trackr.domain.project.Project; /** * @author Moritz Schulze @@ -27,9 +28,9 @@ public interface BillableTimeRepository extends CrudRepository findByProjectAndDateBetweenOrderByDateAsc(@Param("project") Project project, - @Param("start") Date start, - @Param("end") Date end); + @Param("start") LocalDate start, + @Param("end") LocalDate end); @PreAuthorize("hasRole('ROLE_ADMIN')") - List findByDateBetween(@Param("start") Date start, @Param("end") Date end); + List findByDateBetween(@Param("start") LocalDate start, @Param("end") LocalDate end); } diff --git a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeWithProjectProjection.java b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeWithProjectProjection.java index 6c78dd7f..34110622 100644 --- a/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeWithProjectProjection.java +++ b/src/main/java/de/techdev/trackr/domain/project/billtimes/BillableTimeWithProjectProjection.java @@ -1,9 +1,10 @@ package de.techdev.trackr.domain.project.billtimes; import de.techdev.trackr.domain.project.Project; + import org.springframework.data.rest.core.config.Projection; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -16,7 +17,7 @@ public interface BillableTimeWithProjectProjection { Project getProject(); - Date getDate(); + LocalDate getDate(); Integer getMinutes(); } diff --git a/src/main/java/de/techdev/trackr/domain/project/invoice/Invoice.java b/src/main/java/de/techdev/trackr/domain/project/invoice/Invoice.java index 1719f656..1e1ea8b7 100644 --- a/src/main/java/de/techdev/trackr/domain/project/invoice/Invoice.java +++ b/src/main/java/de/techdev/trackr/domain/project/invoice/Invoice.java @@ -3,13 +3,15 @@ import de.techdev.trackr.domain.company.Company; import lombok.Data; import lombok.ToString; + import org.hibernate.validator.constraints.NotEmpty; import javax.persistence.*; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; + import java.math.BigDecimal; -import java.util.Date; +import java.time.LocalDate; @Entity @Data @@ -32,8 +34,7 @@ public static enum InvoiceState { private String identifier; @NotNull - @Temporal(TemporalType.DATE) - private Date creationDate; + private LocalDate creationDate; @Min(0) private BigDecimal invoiceTotal; @@ -42,8 +43,7 @@ public static enum InvoiceState { @JoinColumn(name = "debitor") private Company debitor; - @Temporal(TemporalType.DATE) - private Date dueDate; + private LocalDate dueDate; @NotNull @Enumerated(EnumType.STRING) diff --git a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandler.java b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandler.java index 27774576..2997e162 100644 --- a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandler.java +++ b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandler.java @@ -1,14 +1,12 @@ package de.techdev.trackr.domain.project.invoice; import de.techdev.trackr.domain.company.Company; -import de.techdev.trackr.util.LocalDateUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.rest.core.annotation.*; import org.springframework.security.access.prepost.PreAuthorize; import java.time.LocalDate; -import static de.techdev.trackr.util.LocalDateUtil.fromLocalDate; /** * @author Moritz Schulze @@ -54,7 +52,7 @@ public void linkSave(Invoice invoice, Object links) { protected void setInvoiceStateIfNecessary(Invoice invoice) { if (invoice.getDueDate() != null) { LocalDate today = LocalDate.now(); - if (invoice.getDueDate().before(fromLocalDate(today))) { + if (invoice.getDueDate().isBefore(today)) { invoice.setInvoiceState(Invoice.InvoiceState.OVERDUE); } else { invoice.setInvoiceState(Invoice.InvoiceState.OUTSTANDING); @@ -67,9 +65,9 @@ protected void setInvoiceStateIfNecessary(Invoice invoice) { */ protected void setDueDateFromTimeForPayment(Invoice invoice) { if (invoice.getDueDate() == null && invoice.getDebitor() != null && invoice.getDebitor().getTimeForPayment() != null) { - LocalDate creationDate = LocalDateUtil.fromDate(invoice.getCreationDate()); + LocalDate creationDate = invoice.getCreationDate(); LocalDate dueDate = creationDate.plusDays(invoice.getDebitor().getTimeForPayment()); - invoice.setDueDate(LocalDateUtil.fromLocalDate(dueDate)); + invoice.setDueDate(dueDate); } } } diff --git a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceOverdueService.java b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceOverdueService.java index bc012063..270cdbf1 100644 --- a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceOverdueService.java +++ b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceOverdueService.java @@ -7,7 +7,6 @@ import java.time.LocalDate; import java.util.List; -import static de.techdev.trackr.util.LocalDateUtil.fromLocalDate; /** * Marks invoices as overdue if the due date is after today. @@ -25,7 +24,7 @@ public class InvoiceOverdueService { */ @Transactional public void markOverdueInvoices(LocalDate expiryDate) { - List invoices = invoiceRepository.findByDueDateBeforeAndInvoiceState(fromLocalDate(expiryDate), Invoice.InvoiceState.OUTSTANDING); + List invoices = invoiceRepository.findByDueDateBeforeAndInvoiceState(expiryDate, Invoice.InvoiceState.OUTSTANDING); for (Invoice invoice : invoices) { log.info("Setting state to overdue on invoice {}", invoice); invoice.setInvoiceState(Invoice.InvoiceState.OVERDUE); diff --git a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceRepository.java b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceRepository.java index 1ca8a3ef..cbdc732e 100644 --- a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceRepository.java +++ b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceRepository.java @@ -8,8 +8,8 @@ import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PreAuthorize; -import java.util.Date; -import java.util.List; +import java.time.LocalDate; +import java.util.List; /** * @author Moritz Schulze @@ -30,9 +30,10 @@ public interface InvoiceRepository extends JpaRepository { @PreAuthorize("hasRole('ROLE_ADMIN')") Page findByIdentifierLikeIgnoreCaseAndInvoiceState(@Param("identifier") String identifier, @Param("state") Invoice.InvoiceState state, Pageable pageable); + //TODO Test @RestResource(exported = false) - List findByDueDateBeforeAndInvoiceState(Date date, Invoice.InvoiceState invoiceState); + List findByDueDateBeforeAndInvoiceState(LocalDate date, Invoice.InvoiceState invoiceState); @PreAuthorize("hasRole('ROLE_ADMIN')") - List findByCreationDateBetween(@Param("start") Date start, @Param("end") Date end, @Param("sort") Sort sort); + List findByCreationDateBetween(@Param("start") LocalDate start, @Param("end") LocalDate end, @Param("sort") Sort sort); } diff --git a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceWithDebitorProjection.java b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceWithDebitorProjection.java index 42d5f05b..2750d261 100644 --- a/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceWithDebitorProjection.java +++ b/src/main/java/de/techdev/trackr/domain/project/invoice/InvoiceWithDebitorProjection.java @@ -1,10 +1,11 @@ package de.techdev.trackr.domain.project.invoice; import de.techdev.trackr.domain.company.Company; + import org.springframework.data.rest.core.config.Projection; import java.math.BigDecimal; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -17,13 +18,13 @@ public interface InvoiceWithDebitorProjection { String getIdentifier(); - Date getCreationDate(); + LocalDate getCreationDate(); BigDecimal getInvoiceTotal(); Company getDebitor(); - Date getDueDate(); + LocalDate getDueDate(); Invoice.InvoiceState getInvoiceState(); } diff --git a/src/main/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTime.java b/src/main/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTime.java index 297ec13e..ffc320d6 100644 --- a/src/main/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTime.java +++ b/src/main/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTime.java @@ -1,16 +1,16 @@ package de.techdev.trackr.domain.project.worktimes; -import lombok.Getter; -import lombok.Setter; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.reducing; import java.time.Duration; -import java.util.Date; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.reducing; +import lombok.Getter; +import lombok.Setter; /** * DTO that contains only the needed information for the method findEmployeeMappingByProjectAndDateBetween. @@ -18,7 +18,7 @@ @Getter @Setter public class CustomWorkTime implements Comparable { - private Date date; + private LocalDate date; private Long enteredMinutes; private Double hours; private Long billedTimeId; @@ -32,7 +32,7 @@ public class CustomWorkTime implements Comparable { public static List reduceAndSortWorktimes(List workTimes) { CustomWorkTime identity = new CustomWorkTime(); identity.setEnteredMinutes(0L); - Map mapped = workTimes.stream().collect(groupingBy(CustomWorkTime::getDate, reducing(identity, CustomWorkTime::addOtherWorkTime))); + Map mapped = workTimes.stream().collect(groupingBy(CustomWorkTime::getDate, reducing(identity, CustomWorkTime::addOtherWorkTime))); return mapped.values().stream().sorted().collect(Collectors.toList()); } @@ -45,7 +45,7 @@ public CustomWorkTime addOtherWorkTime(CustomWorkTime other) { public static CustomWorkTime valueOf(WorkTime workTime) { CustomWorkTime customWorkTime = new CustomWorkTime(); - customWorkTime.enteredMinutes = Duration.between(workTime.getStartTime().toLocalTime(), workTime.getEndTime().toLocalTime()).toMinutes(); + customWorkTime.enteredMinutes = Duration.between(workTime.getStartTime(), workTime.getEndTime()).toMinutes(); customWorkTime.date = workTime.getDate(); return customWorkTime; } diff --git a/src/main/java/de/techdev/trackr/domain/project/worktimes/Projections.java b/src/main/java/de/techdev/trackr/domain/project/worktimes/Projections.java index 756a6149..add4276f 100644 --- a/src/main/java/de/techdev/trackr/domain/project/worktimes/Projections.java +++ b/src/main/java/de/techdev/trackr/domain/project/worktimes/Projections.java @@ -2,10 +2,11 @@ import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.project.Project; + import org.springframework.data.rest.core.config.Projection; -import java.sql.Time; -import java.util.Date; +import java.time.LocalDate; +import java.time.LocalTime; /** * @author Moritz Schulze @@ -19,11 +20,11 @@ public static interface WorkTimeWithEmployeeProjection { Employee getEmployee(); - Date getDate(); + LocalDate getDate(); - Time getStartTime(); + LocalTime getStartTime(); - Time getEndTime(); + LocalTime getEndTime(); String getComment(); } @@ -36,11 +37,11 @@ public interface WorkTimeWithProjectProjection { Project getProject(); - Date getDate(); + LocalDate getDate(); - Time getStartTime(); + LocalTime getStartTime(); - Time getEndTime(); + LocalTime getEndTime(); String getComment(); } diff --git a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTime.java b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTime.java index acc5bb91..72e5e4af 100644 --- a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTime.java +++ b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTime.java @@ -1,15 +1,22 @@ package de.techdev.trackr.domain.project.worktimes; +import java.time.LocalDate; +import java.time.LocalTime; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Version; +import javax.validation.constraints.NotNull; + +import lombok.Data; +import lombok.ToString; import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.project.Project; import de.techdev.trackr.domain.validation.constraints.EndAfterBegin; -import lombok.Data; -import lombok.ToString; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.sql.Time; -import java.util.Date; /** * @author Moritz Schulze @@ -38,12 +45,11 @@ public class WorkTime { private Project project; @NotNull - @Temporal(TemporalType.DATE) - private Date date; + private LocalDate date; - private Time startTime; + private LocalTime startTime; - private Time endTime; + private LocalTime endTime; private String comment; diff --git a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeController.java b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeController.java index 1d339b48..86141cde 100644 --- a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeController.java +++ b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeController.java @@ -1,9 +1,16 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.domain.employee.Employee; -import de.techdev.trackr.domain.project.Project; -import de.techdev.trackr.domain.project.billtimes.BillableTime; -import de.techdev.trackr.domain.project.billtimes.BillableTimeRepository; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.mapping; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; + +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.convert.ConversionService; @@ -17,13 +24,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import static java.util.stream.Collectors.*; +import de.techdev.trackr.domain.employee.Employee; +import de.techdev.trackr.domain.project.Project; +import de.techdev.trackr.domain.project.billtimes.BillableTime; +import de.techdev.trackr.domain.project.billtimes.BillableTimeRepository; /** * @author Moritz Schulze @@ -58,8 +62,8 @@ public class WorkTimeController { @ResponseBody public Map findEmployeeMappingByProjectAndDateBetween( @RequestParam("project") String projectId, - @RequestParam("start") Date start, - @RequestParam("end") Date end) { + @RequestParam("start") LocalDate start, + @RequestParam("end") LocalDate end) { //TODO: Make spring do the conversion automatically Project project = conversionService.convert(Long.valueOf(projectId), Project.class); List workTimes = workTimeRepository.findByProjectAndDateBetweenOrderByDateAscStartTimeAsc(project, start, end); @@ -74,7 +78,7 @@ public Map findEmployeeMappingByProjectAndDateBetween( * @param project The project * @return A map of employee id to a map of date to billable times. */ - protected Map> getBilledMinutesMapping(Date start, Date end, Project project) { + protected Map> getBilledMinutesMapping(LocalDate start, LocalDate end, Project project) { List billableTimes = billableTimeRepository.findByProjectAndDateBetweenOrderByDateAsc(project, start, end); return billableTimes.stream().collect( groupingBy(bt -> bt.getEmployee().getId(), @@ -90,7 +94,7 @@ protected Map> getBilledMinutesMapping(Date start, * @param billedMinutesMapping Mapping of already billed minutes * @return The mapping of Long to WorkTimeEmployee */ - protected Map convertStreamOfWorkTimesToMap(List workTimes, Map> billedMinutesMapping) { + protected Map convertStreamOfWorkTimesToMap(List workTimes, Map> billedMinutesMapping) { return workTimes.stream().collect( groupingBy( WorkTime::getEmployee, diff --git a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeEmployee.java b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeEmployee.java index 0c47bde0..2e41b6b4 100644 --- a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeEmployee.java +++ b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeEmployee.java @@ -1,17 +1,16 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.domain.employee.Employee; -import de.techdev.trackr.domain.project.billtimes.BillableTime; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + import lombok.Data; import lombok.EqualsAndHashCode; -import org.springframework.hateoas.ResourceSupport; -import java.util.Date; -import java.util.List; -import java.util.Map; +import org.springframework.hateoas.ResourceSupport; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.reducing; +import de.techdev.trackr.domain.employee.Employee; +import de.techdev.trackr.domain.project.billtimes.BillableTime; /** * DTO that contains only the needed information for the method findEmployeeMappingByProjectAndDateBetween. @@ -41,7 +40,7 @@ public static WorkTimeEmployee valueOf(Employee employee, List w return workTimeEmployee; } - public void addBilledMinutes(Map dateBillableTimeMapping) { + public void addBilledMinutes(Map dateBillableTimeMapping) { workTimes.forEach(ctw -> { if(dateBillableTimeMapping != null && dateBillableTimeMapping.get(ctw.getDate()) != null) { ctw.setBilledTimeId(dateBillableTimeMapping.get(ctw.getDate()).getId()); diff --git a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepository.java b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepository.java index d124c282..e9100b0d 100644 --- a/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepository.java +++ b/src/main/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepository.java @@ -1,17 +1,16 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.domain.employee.Employee; -import de.techdev.trackr.domain.project.Project; -import org.springframework.data.jpa.repository.Temporal; +import java.time.LocalDate; +import java.util.List; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PreAuthorize; -import javax.persistence.TemporalType; -import java.util.Date; -import java.util.List; +import de.techdev.trackr.domain.employee.Employee; +import de.techdev.trackr.domain.project.Project; /** * @author Moritz Schulze @@ -31,18 +30,18 @@ public interface WorkTimeRepository extends CrudRepository { WorkTime findOne(Long aLong); @PreAuthorize("hasRole('ROLE_SUPERVISOR') or #employee.id == principal?.id") - List findByEmployeeAndDateOrderByStartTimeAsc(@Param("employee") Employee employee, @Param("date") @Temporal(TemporalType.DATE) Date date); + List findByEmployeeAndDateOrderByStartTimeAsc(@Param("employee") Employee employee, @Param("date") LocalDate date); @PreAuthorize("hasRole('ROLE_SUPERVISOR') or #employee.id == principal?.id") List findByEmployeeAndDateBetweenOrderByDateAscStartTimeAsc(@Param("employee") Employee employee, - @Param("start") @Temporal(TemporalType.DATE) Date start, - @Param("end") @Temporal(TemporalType.DATE) Date end); + @Param("start") LocalDate start, + @Param("end") LocalDate end); @PreAuthorize("hasRole('ROLE_SUPERVISOR')") List findByProjectAndDateBetweenOrderByDateAscStartTimeAsc(@Param("project") Project project, - @Param("start") @Temporal(TemporalType.DATE) Date start, - @Param("end") @Temporal(TemporalType.DATE) Date end); + @Param("start") LocalDate start, + @Param("end") LocalDate end); @PreAuthorize("hasRole('ROLE_ADMIN')") - List findByDateBetween(@Param("start") Date start, @Param("end") Date end); + List findByDateBetween(@Param("start") LocalDate start, @Param("end") LocalDate end); } diff --git a/src/main/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTrigger.java b/src/main/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTrigger.java index 675adca8..0560747d 100644 --- a/src/main/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTrigger.java +++ b/src/main/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTrigger.java @@ -1,10 +1,12 @@ package de.techdev.trackr.domain.scheduling; import de.techdev.trackr.domain.common.FederalState; +import de.techdev.trackr.domain.employee.vacation.Holiday; import de.techdev.trackr.domain.employee.vacation.HolidayRepository; import de.techdev.trackr.util.LocalDateUtil; import lombok.Setter; import lombok.extern.slf4j.Slf4j; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; @@ -16,7 +18,6 @@ import java.util.List; import java.util.stream.Collectors; -import static de.techdev.trackr.util.LocalDateUtil.fromDate; import static de.techdev.trackr.util.LocalDateUtil.fromLocalDate; /** @@ -44,8 +45,8 @@ protected List getHolidaysForMonth(FederalState state, LocalDate mont LocalDate firstDayOfMonth = month.with(TemporalAdjusters.firstDayOfMonth()); LocalDate lastDayOfMonth = month.with(TemporalAdjusters.lastDayOfMonth()); return holidayRepository - .findByFederalStateAndDayBetween(state, fromLocalDate(firstDayOfMonth), fromLocalDate(lastDayOfMonth)) - .stream().map(holiday -> fromDate(holiday.getDay())) + .findByFederalStateAndDayBetween(state, firstDayOfMonth, lastDayOfMonth) + .stream().map(Holiday::getDay) .collect(Collectors.toList()); } diff --git a/src/main/java/de/techdev/trackr/domain/validation/EndAfterBeginValidator.java b/src/main/java/de/techdev/trackr/domain/validation/EndAfterBeginValidator.java index 1a96b3d7..2f618dde 100644 --- a/src/main/java/de/techdev/trackr/domain/validation/EndAfterBeginValidator.java +++ b/src/main/java/de/techdev/trackr/domain/validation/EndAfterBeginValidator.java @@ -1,11 +1,15 @@ package de.techdev.trackr.domain.validation; -import de.techdev.trackr.domain.validation.constraints.EndAfterBegin; -import org.springframework.beans.DirectFieldAccessor; +import java.time.LocalTime; +import java.time.chrono.ChronoLocalDate; +import java.util.Date; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.util.Date; + +import org.springframework.beans.DirectFieldAccessor; + +import de.techdev.trackr.domain.validation.constraints.EndAfterBegin; /** * @author Moritz Schulze @@ -25,23 +29,59 @@ public void initialize(EndAfterBegin constraintAnnotation) { @Override public boolean isValid(Object value, ConstraintValidatorContext context) { - DirectFieldAccessor dfa = new DirectFieldAccessor(value); - Class beginFieldType = dfa.getPropertyType(beginFieldName); - Class endFieldType = dfa.getPropertyType(endFieldName); - - if(! (Date.class.isAssignableFrom(beginFieldType) || Date.class.isAssignableFrom(endFieldType)) ) { - throw new IllegalArgumentException("Fields are not date objects."); - } - Date beginField = (Date) dfa.getPropertyValue(beginFieldName); - Date endField = (Date) dfa.getPropertyValue(endFieldName); + if(beginOrEndIsNull(value)) return true; - boolean isValid = beginField == null || endField == null || !beginField.after(endField); + DirectFieldAccessor dfa = new DirectFieldAccessor(value); + boolean isValid = hasValidLocalDates(dfa) || hasValidLocalTimes(dfa)|| hasValidDates(dfa); if (!isValid) { - context.disableDefaultConstraintViolation(); - context. - buildConstraintViolationWithTemplate(messageTemplate) - .addNode(endFieldName).addConstraintViolation(); + messageIsNonValid(context); } return isValid; } + + private boolean beginOrEndIsNull(Object value) { + DirectFieldAccessor dfa = new DirectFieldAccessor(value); + return dfa.getPropertyValue(beginFieldName)==null || dfa.getPropertyValue(endFieldName)==null; + } + + private boolean hasValidLocalDates(DirectFieldAccessor value) { + if(areBeginAndEndInstanceOf(ChronoLocalDate.class, value)) { + ChronoLocalDate beginField = (ChronoLocalDate) value.getPropertyValue(beginFieldName); + ChronoLocalDate endField = (ChronoLocalDate) value.getPropertyValue(endFieldName); + return !beginField.isAfter(endField); + }; + return false; + } + + private boolean hasValidLocalTimes(DirectFieldAccessor value) { + if(areBeginAndEndInstanceOf(LocalTime.class, value)) { + LocalTime beginField = (LocalTime) value.getPropertyValue(beginFieldName); + LocalTime endField = (LocalTime) value.getPropertyValue(endFieldName); + return !beginField.isAfter(endField); + }; + return false; + } + + private boolean hasValidDates(DirectFieldAccessor value) { + if(areBeginAndEndInstanceOf(Date.class, value)) { + Date beginField = (Date) value.getPropertyValue(beginFieldName); + Date endField = (Date) value.getPropertyValue(endFieldName); + return !beginField.after(endField); + }; + return false; + } + + private boolean areBeginAndEndInstanceOf(Class clazz, DirectFieldAccessor value) { + Class beginFieldType = value.getPropertyType(beginFieldName); + Class endFieldType = value.getPropertyType(endFieldName); + + return clazz.isAssignableFrom(beginFieldType) && clazz.isAssignableFrom(endFieldType); + } + + private void messageIsNonValid(ConstraintValidatorContext context) { + context.disableDefaultConstraintViolation(); + context. + buildConstraintViolationWithTemplate(messageTemplate) + .addNode(endFieldName).addConstraintViolation(); + } } diff --git a/src/main/resources/application_dev.properties b/src/main/resources/application_dev.properties index 5bca406e..b2d7a5cb 100644 --- a/src/main/resources/application_dev.properties +++ b/src/main/resources/application_dev.properties @@ -1 +1,3 @@ -trackr.frontendUrl=http://localhost \ No newline at end of file +trackr.frontendUrl=http://localhost +proxy.path="" +oauth.trackr-page.redirect_uris="" diff --git a/src/main/resources/pdfTemplates/travel-expenses/report.html b/src/main/resources/pdfTemplates/travel-expenses/report.html index 4e5b73cc..256df213 100644 --- a/src/main/resources/pdfTemplates/travel-expenses/report.html +++ b/src/main/resources/pdfTemplates/travel-expenses/report.html @@ -29,8 +29,8 @@

Travel Expense Report # Period: - 10.10.2013 - - 13.10.2013 + 10.10.2013 - + 13.10.2013 Total: @@ -52,8 +52,8 @@

Travel Expense Report # TAXI - 10.10.2013 - 13.10.2013 + 10.10.2013 + 13.10.2013 12% 34 € Comment @@ -63,7 +63,7 @@

Travel Expense Report #
- Date: 24.07.1983 + Date: 24.07.1983





diff --git a/src/test/java/de/techdev/trackr/domain/company/ContactPersonResourceTest.java b/src/test/java/de/techdev/trackr/domain/company/ContactPersonResourceTest.java index 4036e636..592372b6 100644 --- a/src/test/java/de/techdev/trackr/domain/company/ContactPersonResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/company/ContactPersonResourceTest.java @@ -7,7 +7,6 @@ import java.io.StringWriter; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; -import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; diff --git a/src/test/java/de/techdev/trackr/domain/employee/EmployeeDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/EmployeeDataOnDemand.java index c501be2d..c45a3657 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/EmployeeDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/EmployeeDataOnDemand.java @@ -5,11 +5,12 @@ import de.techdev.trackr.domain.employee.login.Authority; import de.techdev.trackr.domain.employee.login.AuthorityDataOnDemand; import de.techdev.trackr.domain.employee.login.Credential; + import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.List; /** @@ -33,7 +34,7 @@ public Employee getNewTransientObject(int i) { employee.setHourlyCostRate(BigDecimal.TEN.multiply(new BigDecimal(i))); employee.setPhoneNumber("phoneNumber_" + i); employee.setTitle("title_" + i); - employee.setJoinDate(new Date()); + employee.setJoinDate(LocalDate.now()); employee.setFederalState(FederalState.BERLIN); employee.setVacationEntitlement((float) i); Credential credential = new Credential(); diff --git a/src/test/java/de/techdev/trackr/domain/employee/EmployeeResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/EmployeeResourceTest.java index 51fe4dfe..dbfe0549 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/EmployeeResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/EmployeeResourceTest.java @@ -4,6 +4,7 @@ import de.techdev.trackr.domain.AbstractDomainResourceTest; import de.techdev.trackr.domain.employee.login.Credential; import de.techdev.trackr.domain.employee.login.CredentialDataOnDemand; + import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -11,10 +12,12 @@ import org.springframework.security.core.context.SecurityContextHolder; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; +import java.time.LocalDate; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; import static org.echocat.jomon.testing.BaseMatchers.isTrue; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -216,11 +219,10 @@ public void deleteCredentialForbidden() throws Exception { @Test public void setLeaveDateDeactivatesEmployeeIfIsInPast() throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Employee employee = dataOnDemand.getRandomObject(); SecurityContextHolder.getContext().setAuthentication(AuthorityMocks.adminAuthentication()); employee.getCredential().setEnabled(true); - employee.setJoinDate(sdf.parse("2013-12-01")); + employee.setJoinDate(LocalDate.parse("2013-12-01")); repository.save(employee); mockMvc.perform( patch("/employees/" + employee.getId()) @@ -252,7 +254,6 @@ public void setLeaveDateDoesNotDeactivateEmployeeIfIsInFuture() throws Exception protected String getJsonRepresentation(Employee employee) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); jg.writeStartObject() .write("firstName", employee.getFirstName()) .write("lastName", employee.getLastName()) @@ -266,11 +267,11 @@ protected String getJsonRepresentation(Employee employee) { } if (employee.getJoinDate() != null) { - jg.write("joinDate", sdf.format(employee.getJoinDate())); + jg.write("joinDate", ISO_LOCAL_DATE.format(employee.getJoinDate())); } if (employee.getLeaveDate() != null) { - jg.write("leaveDate", sdf.format(employee.getLeaveDate())); + jg.write("leaveDate", ISO_LOCAL_DATE.format(employee.getLeaveDate())); } if (employee.getPhoneNumber() != null) { diff --git a/src/test/java/de/techdev/trackr/domain/employee/EmployeeScheduledJobIntegrationTest.java b/src/test/java/de/techdev/trackr/domain/employee/EmployeeScheduledJobIntegrationTest.java index 3dc3342c..8d2d918d 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/EmployeeScheduledJobIntegrationTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/EmployeeScheduledJobIntegrationTest.java @@ -3,13 +3,11 @@ import de.techdev.trackr.TransactionalIntegrationTest; import de.techdev.trackr.core.security.RemoveTokenService; import de.techdev.trackr.domain.employee.login.DeactivateEmployeesService; -import de.techdev.trackr.util.LocalDateUtil; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDate; -import java.util.Date; import static org.echocat.jomon.testing.BaseMatchers.isFalse; import static org.hamcrest.MatcherAssert.assertThat; @@ -42,8 +40,8 @@ public void setUp() throws Exception { @Test public void deactivateEmployeesWithLeaveDateToday() throws Exception { Employee employee = employeeDataOnDemand.getRandomObject(); - employee.setJoinDate(LocalDateUtil.fromLocalDate(LocalDate.now().minusDays(7))); - employee.setLeaveDate(new Date()); + employee.setJoinDate(LocalDate.now().minusDays(7)); + employee.setLeaveDate(LocalDate.now()); employee.getCredential().setEnabled(true); employeeRepository.save(employee); diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseDataOnDemand.java index 3920771e..ab7e90a4 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseDataOnDemand.java @@ -2,10 +2,12 @@ import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.employee.expenses.report.ReportDataOnDemand; + import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; -import java.util.Date; +import java.time.Instant; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -24,11 +26,11 @@ protected int getExpectedElements() { public TravelExpense getNewTransientObject(int i) { TravelExpense travelExpense = new TravelExpense(); travelExpense.setReport(travelExpenseReportDataOnDemand.getRandomObject()); - travelExpense.setFromDate(new Date()); - travelExpense.setToDate(new Date()); + travelExpense.setFromDate( LocalDate.now()); + travelExpense.setToDate(LocalDate.now()); travelExpense.setCost(BigDecimal.TEN); travelExpense.setType(TravelExpense.Type.TAXI); - travelExpense.setSubmissionDate(new Date()); + travelExpense.setSubmissionDate(Instant.now()); travelExpense.setVat(BigDecimal.ONE); travelExpense.setComment("comment_" + i); return travelExpense; diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseResourceTest.java index f2950d38..795503e4 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/TravelExpenseResourceTest.java @@ -2,13 +2,14 @@ import de.techdev.trackr.domain.AbstractDomainResourceTest; import de.techdev.trackr.domain.employee.expenses.reports.Report; + import org.junit.Ignore; import org.junit.Test; import org.springframework.mock.web.MockHttpSession; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; import java.util.function.Function; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; @@ -19,7 +20,8 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - +import static java.time.format.DateTimeFormatter.ISO_INSTANT; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; /** * @author Moritz Schulze */ @@ -125,14 +127,12 @@ public void accessTypes() throws Exception { protected String getJsonRepresentation(TravelExpense travelExpense) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); jg.writeStartObject() .write("cost", travelExpense.getCost()) .write("vat", travelExpense.getVat()) - .write("fromDate", sdf.format(travelExpense.getFromDate())) - .write("toDate", sdf.format(travelExpense.getToDate())) - .write("submissionDate", sdf2.format(travelExpense.getSubmissionDate())) + .write("fromDate", ISO_LOCAL_DATE.format(travelExpense.getFromDate())) + .write("toDate", ISO_LOCAL_DATE.format(travelExpense.getToDate())) + .write("submissionDate", ISO_INSTANT.format(travelExpense.getSubmissionDate())) .write("type", travelExpense.getType().toString()) .write("report", "/travelExpenseReports/" + travelExpense.getReport().getId()); diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportDataOnDemand.java index d3f3be55..9ffb5d5d 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportDataOnDemand.java @@ -5,9 +5,10 @@ import de.techdev.trackr.domain.employee.expenses.reports.Report; import de.techdev.trackr.domain.project.Project; import de.techdev.trackr.domain.project.ProjectDataOnDemand; + import org.springframework.beans.factory.annotation.Autowired; -import java.util.Date; +import java.time.Instant; /** * @author Moritz Schulze @@ -30,7 +31,7 @@ public Report getNewTransientObject(int i) { Report travelExpenseReport = new Report(); travelExpenseReport.setEmployee(employeeDataOnDemand.getRandomObject()); travelExpenseReport.setStatus(Report.Status.PENDING); - travelExpenseReport.setSubmissionDate(new Date()); + travelExpenseReport.setSubmissionDate( Instant.now()); Project project = projectDataOnDemand.getRandomObject(); travelExpenseReport.setDebitor(project.getCompany()); diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportResourceTest.java index ad0ea427..1aaa6177 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportResourceTest.java @@ -3,17 +3,19 @@ import de.techdev.trackr.core.security.AuthorityMocks; import de.techdev.trackr.domain.AbstractDomainResourceTest; import de.techdev.trackr.domain.employee.expenses.reports.Report; + import org.junit.Ignore; import org.junit.Test; import org.springframework.mock.web.MockHttpSession; import org.springframework.security.core.context.SecurityContextHolder; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; import java.util.function.Function; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; +import static java.time.format.DateTimeFormatter.ISO_INSTANT; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -206,18 +208,28 @@ public void pdfExport() throws Exception { .andExpect(status().isOk()); } + @Test + public void findBySubmissionDateBetween() throws Exception { + mockMvc.perform( + get("/travelExpenseReports/search/findBySubmissionDateBetween") + .session(adminSession()) + .param("start", "2014-07-01T00:00:00Z") + .param("end", "2014-08-09T00:00:00Z") + ) + .andExpect(status().isOk()); + } + @Override protected String getJsonRepresentation(Report travelExpenseReport) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); jg.writeStartObject() .write("status", travelExpenseReport.getStatus().toString()) .write("employee", "/employees/" + travelExpenseReport.getEmployee().getId()) .write("debitor", "/companies/" + travelExpenseReport.getDebitor().getId()); if(travelExpenseReport.getSubmissionDate() != null) { - jg.write("submissionDate", sdf.format(travelExpenseReport.getSubmissionDate())); + jg.write("submissionDate", ISO_INSTANT.format(travelExpenseReport.getSubmissionDate())); } if (travelExpenseReport.getProject() != null) { jg.write("project", "/projects/" + travelExpenseReport.getProject().getId()); diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportServiceTest.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportServiceTest.java index 641d7931..3c411e4a 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportServiceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/ReportServiceTest.java @@ -8,13 +8,14 @@ import de.techdev.trackr.domain.employee.expenses.report.ReportDataOnDemand; import de.techdev.trackr.domain.employee.expenses.reports.Report; import de.techdev.trackr.domain.employee.expenses.reports.ReportService; -import de.techdev.trackr.util.LocalDateUtil; + import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; +import java.time.Instant; import java.time.LocalDate; -import java.util.Date; +import java.time.ZoneId; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -56,13 +57,12 @@ public void testApprove() throws Exception { @Test public void testSubmit() throws Exception { Report travelExpenseReport = dataOnDemand.getRandomObject(); - LocalDate localDate = LocalDate.of(2014, 1, 1); - Date date = LocalDateUtil.fromLocalDate(localDate); + Instant localDate = LocalDate.of(2014, 1, 1).atStartOfDay(ZoneId.systemDefault()).toInstant(); travelExpenseReport.setStatus(Report.Status.PENDING); - travelExpenseReport.setSubmissionDate(date); + travelExpenseReport.setSubmissionDate(localDate); Report result = service.submit(travelExpenseReport); assertThat(result.getStatus(), is(Report.Status.SUBMITTED)); - assertThat(result.getSubmissionDate().after(date), is(true)); + assertThat(result.getSubmissionDate().isAfter(localDate), is(true)); } } \ No newline at end of file diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentDataOnDemand.java index 5bfeea90..02348fa2 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentDataOnDemand.java @@ -4,10 +4,10 @@ import de.techdev.trackr.domain.employee.expenses.report.ReportDataOnDemand; import de.techdev.trackr.domain.employee.expenses.reports.Report; import de.techdev.trackr.domain.employee.expenses.reports.comments.Comment; -import org.springframework.beans.factory.annotation.Autowired; -import java.util.Date; +import org.springframework.beans.factory.annotation.Autowired; +import java.time.Instant; /** * @author Moritz Schulze */ @@ -19,7 +19,7 @@ public class CommentDataOnDemand extends AbstractDataOnDemand { @Override public Comment getNewTransientObject(int i) { Comment comment = new Comment(); - comment.setSubmissionDate(new Date()); + comment.setSubmissionDate(Instant.now()); comment.setText("text_"+i); Report report = travelExpenseReportDataOnDemand.getRandomObject(); comment.setTravelExpenseReport(report); diff --git a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentResourceTest.java index 0e973140..d1ed8fb7 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/expenses/report/comment/CommentResourceTest.java @@ -2,15 +2,17 @@ import de.techdev.trackr.domain.AbstractDomainResourceTest; import de.techdev.trackr.domain.employee.expenses.reports.comments.Comment; + import org.junit.Test; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isCreated; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isForbidden; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isMethodNotAllowed; +import static java.time.format.DateTimeFormatter.ISO_INSTANT; import static org.hamcrest.MatcherAssert.assertThat; public class CommentResourceTest extends AbstractDomainResourceTest { @@ -54,11 +56,10 @@ public void deleteNotExported() throws Exception { protected String getJsonRepresentation(Comment comment) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); jg.writeStartObject() .write("text", comment.getText()) .write("employee", "/employees/" + comment.getEmployee().getId()) - .write("submissionDate", sdf.format(comment.getSubmissionDate())) + .write("submissionDate", ISO_INSTANT.format(comment.getSubmissionDate())) .write("travelExpenseReport", "/travelExpenseReports/" + comment.getTravelExpenseReport().getId()); diff --git a/src/test/java/de/techdev/trackr/domain/employee/login/AuthorityResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/login/AuthorityResourceTest.java index bfcd537d..2ff310b6 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/login/AuthorityResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/login/AuthorityResourceTest.java @@ -2,11 +2,9 @@ import de.techdev.trackr.domain.AbstractDomainResourceTest; import org.junit.Test; -import org.springframework.http.MediaType; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isAccessible; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isMethodNotAllowed; -import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; diff --git a/src/test/java/de/techdev/trackr/domain/employee/login/CredentialDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/login/CredentialDataOnDemand.java index c9ccef23..aaa395cc 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/login/CredentialDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/login/CredentialDataOnDemand.java @@ -1,7 +1,6 @@ package de.techdev.trackr.domain.employee.login; import de.techdev.trackr.domain.AbstractDataOnDemand; -import de.techdev.trackr.domain.AbstractDomainResourceTest; import de.techdev.trackr.domain.employee.EmployeeDataOnDemand; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysDataOnDemand.java index cb331612..abd04a76 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysDataOnDemand.java @@ -2,7 +2,6 @@ import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.employee.EmployeeDataOnDemand; -import de.techdev.trackr.util.LocalDateUtil; import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDate; @@ -21,9 +20,9 @@ public SickDays getNewTransientObject(int i) { SickDays sickDays = new SickDays(); sickDays.setEmployee(employeeDataOnDemand.getRandomObject()); LocalDate now = LocalDate.now(); - sickDays.setStartDate(LocalDateUtil.fromLocalDate(now)); + sickDays.setStartDate(now); if (i % 2 == 0) { - sickDays.setEndDate(LocalDateUtil.fromLocalDate(now.plusDays(i))); + sickDays.setEndDate(now.plusDays(i)); } return sickDays; } diff --git a/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysResourceTest.java index 44ded7a6..24cb228b 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/sickdays/SickDaysResourceTest.java @@ -1,16 +1,18 @@ package de.techdev.trackr.domain.employee.sickdays; import de.techdev.trackr.domain.AbstractDomainResourceTest; + import org.junit.Ignore; import org.junit.Test; import org.springframework.mock.web.MockHttpSession; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; import java.util.function.Function; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; import static org.echocat.jomon.testing.Assert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -136,12 +138,11 @@ public void findByStartDateBetweenOrEndDateBetweenIsForbiddenForSupervisor() thr protected String getJsonRepresentation(SickDays sickDays) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); jg.writeStartObject() - .write("startDate", sdf.format(sickDays.getStartDate())); + .write("startDate", ISO_LOCAL_DATE.format(sickDays.getStartDate())); if (sickDays.getEndDate() != null) { - jg.write("endDate", sdf.format(sickDays.getEndDate())); + jg.write("endDate", ISO_LOCAL_DATE.format(sickDays.getEndDate())); } if (sickDays.getEmployee() != null) { diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayDataOnDemand.java index bddb51f7..31a5cdc2 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayDataOnDemand.java @@ -3,7 +3,7 @@ import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.common.FederalState; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -14,8 +14,8 @@ public class HolidayDataOnDemand extends AbstractDataOnDemand { public Holiday getNewTransientObject(int i) { Holiday holiday = new Holiday(); holiday.setFederalState(FederalState.values()[i % FederalState.values().length]); - holiday.setDay(new Date()); + holiday.setDay( LocalDate.now()); holiday.setName("holiday_" + i); - return holiday; + return holiday; } } diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayResourceTest.java index b4f1f9cc..cd9a4a93 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/HolidayResourceTest.java @@ -1,14 +1,16 @@ package de.techdev.trackr.domain.employee.vacation; import de.techdev.trackr.domain.AbstractDomainResourceTest; + import org.junit.Test; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isAccessible; import static de.techdev.trackr.domain.DomainResourceTestMatchers.isMethodNotAllowed; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; import static org.junit.Assert.*; public class HolidayResourceTest extends AbstractDomainResourceTest { @@ -45,12 +47,11 @@ public void deleteNotExported() throws Exception { @Override protected String getJsonRepresentation(Holiday holiday) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); StringWriter writer = new StringWriter(); JsonGenerator jsonGenerator = jsonGeneratorFactory.createGenerator(writer); JsonGenerator jg = jsonGenerator .writeStartObject() - .write("startDate", sdf.format(holiday.getDay())) + .write("startDate", ISO_LOCAL_DATE.format(holiday.getDay())) .write("status", holiday.getName()) .write("federalState", holiday.getFederalState().toString()); diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveServiceIntegrationTest.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveServiceIntegrationTest.java index 5793bdf2..d20955d3 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveServiceIntegrationTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestApproveServiceIntegrationTest.java @@ -6,13 +6,14 @@ import de.techdev.trackr.core.security.MethodSecurityConfiguration; import de.techdev.trackr.core.security.SecurityConfiguration; import de.techdev.trackr.domain.ApiBeansConfiguration; -import de.techdev.trackr.util.LocalDateUtil; + import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ContextConfiguration; import java.time.LocalDate; +import java.time.ZoneId; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -67,7 +68,7 @@ public void rejectNotAllowedForSelfDoesRollback() throws Exception { public void approveSevenDayOldRequests() throws Exception { VacationRequest vacationRequest = vacationRequestDataOnDemand.getRandomObject(); vacationRequest.setStatus(VacationRequest.VacationRequestStatus.PENDING); - vacationRequest.setSubmissionTime(LocalDateUtil.fromLocalDate(LocalDate.now().minusDays(8))); + vacationRequest.setSubmissionTime(LocalDate.now().minusDays(8).atStartOfDay(ZoneId.systemDefault()).toInstant()); vacationRequestRepository.save(vacationRequest); SecurityContextHolder.getContext().setAuthentication(AuthorityMocks.adminAuthentication()); vacationRequestApproveService.approveSevenDayOldRequests(); diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestDataOnDemand.java index aea53164..8ee094f0 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestDataOnDemand.java @@ -2,9 +2,10 @@ import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.employee.EmployeeDataOnDemand; + import org.springframework.beans.factory.annotation.Autowired; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -19,8 +20,8 @@ public VacationRequest getNewTransientObject(int i) { VacationRequest vacationRequest = new VacationRequest(); vacationRequest.setStatus(VacationRequest.VacationRequestStatus.PENDING); vacationRequest.setEmployee(employeeDataOnDemand.getRandomObject()); - vacationRequest.setStartDate(new Date()); - vacationRequest.setEndDate(new Date()); + vacationRequest.setStartDate(LocalDate.now()); + vacationRequest.setEndDate( LocalDate.now()); return vacationRequest; } diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepositoryTest.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepositoryTest.java index 4ded2fea..d997f0f8 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepositoryTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestRepositoryTest.java @@ -1,12 +1,14 @@ package de.techdev.trackr.domain.employee.vacation; import de.techdev.trackr.TransactionalIntegrationTest; -import de.techdev.trackr.util.LocalDateUtil; + import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.time.Instant; import java.time.LocalDate; +import java.time.ZoneId; import java.util.List; import static org.echocat.jomon.testing.BaseMatchers.isNotEmpty; @@ -59,10 +61,12 @@ public void findByApprovedOrderBySubmissionTimeAsc() throws Exception { @Test public void findBySubmissionTimeBefore() throws Exception { VacationRequest vacationRequest = vacationRequestDataOnDemand.getRandomObject(); - vacationRequest.setSubmissionTime(LocalDateUtil.fromLocalDate(LocalDate.now().minusDays(8))); + Instant theDay8DaysBeforeNow = LocalDate.now().minusDays(8).atStartOfDay(ZoneId.systemDefault()).toInstant(); + vacationRequest.setSubmissionTime(theDay8DaysBeforeNow); vacationRequest.setStatus(VacationRequest.VacationRequestStatus.PENDING); vacationRequestRepository.save(vacationRequest); - List all = vacationRequestRepository.findBySubmissionTimeBeforeAndStatus(LocalDateUtil.fromLocalDate(LocalDate.now().minusDays(7)), VacationRequest.VacationRequestStatus.PENDING); + Instant sevenDaysBefore = LocalDate.now().minusDays(7).atStartOfDay(ZoneId.systemDefault()).toInstant(); + List all = vacationRequestRepository.findBySubmissionTimeBeforeAndStatus(sevenDaysBefore, VacationRequest.VacationRequestStatus.PENDING); assertThat(all, isNotEmpty()); } } diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestResourceTest.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestResourceTest.java index 387e2ac6..28ca9285 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/VacationRequestResourceTest.java @@ -3,6 +3,7 @@ import de.techdev.trackr.core.security.AuthorityMocks; import de.techdev.trackr.domain.AbstractDomainResourceTest; import de.techdev.trackr.domain.employee.EmployeeDataOnDemand; + import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -10,12 +11,16 @@ import org.springframework.security.core.context.SecurityContextHolder; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; import java.util.Date; import java.util.function.Function; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; +import static java.time.format.DateTimeFormatter.ISO_INSTANT; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; import static org.echocat.jomon.testing.BaseMatchers.isNotNull; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -304,13 +309,17 @@ public void daysPerEmployeeBetweenAccessibleForAdmin() throws Exception { mockMvc.perform( get("/vacationRequests/daysPerEmployeeBetween") .session(adminSession()) - .param("start", String.valueOf(vacationRequest.getStartDate().getTime())) - .param("end", String.valueOf(vacationRequest.getEndDate().getTime())) + .param("start", String.valueOf(toEpochMilli(vacationRequest.getStartDate()))) + .param("end", String.valueOf(toEpochMilli(vacationRequest.getEndDate()))) ) .andExpect(status().isOk()) .andExpect(jsonPath(vacationRequest.getEmployee().getFirstName() + " " + vacationRequest.getEmployee().getLastName()).exists()); } + private long toEpochMilli(LocalDate startDate) { + return startDate.atStartOfDay(ZoneId.systemDefault()).toEpochSecond()*1000; + } + @Test public void daysPerEmployeeBetweenForbiddenForSupervisor() throws Exception { mockMvc.perform( @@ -324,14 +333,12 @@ public void daysPerEmployeeBetweenForbiddenForSupervisor() throws Exception { @Override protected String getJsonRepresentation(VacationRequest vacationRequest) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); StringWriter writer = new StringWriter(); JsonGenerator jsonGenerator = jsonGeneratorFactory.createGenerator(writer); JsonGenerator jg = jsonGenerator .writeStartObject() - .write("startDate", sdf.format(vacationRequest.getStartDate())) - .write("endDate", sdf.format(vacationRequest.getEndDate())) + .write("startDate", ISO_LOCAL_DATE.format(vacationRequest.getStartDate())) + .write("endDate", ISO_LOCAL_DATE.format(vacationRequest.getEndDate())) .write("status", vacationRequest.getStatus().toString()) .write("employee", "/api/employees/" + vacationRequest.getEmployee().getId()); @@ -339,13 +346,13 @@ protected String getJsonRepresentation(VacationRequest vacationRequest) { jg.write("id", vacationRequest.getId()); } if (vacationRequest.getApprovalDate() != null) { - jg.write("approvalDate", sdf2.format(vacationRequest.getApprovalDate())); - } + jg.write("approvalDate", ISO_INSTANT.format(vacationRequest.getApprovalDate())); + } if (vacationRequest.getNumberOfDays() != null) { jg.write("numberOfDays", vacationRequest.getNumberOfDays()); } if (vacationRequest.getSubmissionTime() != null) { - jg.write("submissionTime", sdf2.format(vacationRequest.getSubmissionTime())); + jg.write("submissionTime", ISO_INSTANT.format(vacationRequest.getSubmissionTime())); } jg.writeEnd().close(); diff --git a/src/test/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalServiceTest.java b/src/test/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalServiceTest.java index ef1c190e..0c2e52a1 100644 --- a/src/test/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalServiceTest.java +++ b/src/test/java/de/techdev/trackr/domain/employee/vacation/support/VacationRequestEmployeeToDaysTotalServiceTest.java @@ -2,12 +2,10 @@ import de.techdev.trackr.domain.employee.Employee; import de.techdev.trackr.domain.employee.vacation.VacationRequest; -import de.techdev.trackr.util.LocalDateUtil; import org.junit.Before; import org.junit.Test; import java.time.LocalDate; -import java.util.Date; import java.util.Map; import static java.util.Arrays.asList; @@ -25,17 +23,17 @@ public void setUp() throws Exception { @Test public void testGetMinimum() throws Exception { - Date date1 = LocalDateUtil.fromLocalDate(LocalDate.of(2014, 7, 1)); - Date date2 = LocalDateUtil.fromLocalDate(LocalDate.of(2014, 7, 2)); - Date minimum = service.getMinimum(date1, date2); + LocalDate date1 = LocalDate.of(2014, 7, 1); + LocalDate date2 = LocalDate.of(2014, 7, 2); + LocalDate minimum = service.getMinimum(date1, date2); assertThat(minimum, is(date1)); } @Test public void testGetMaximum() throws Exception { - Date date1 = LocalDateUtil.fromLocalDate(LocalDate.of(2014, 7, 1)); - Date date2 = LocalDateUtil.fromLocalDate(LocalDate.of(2014, 7, 2)); - Date maximum = service.getMaximum(date1, date2); + LocalDate date1 = LocalDate.of(2014, 7, 1); + LocalDate date2 = LocalDate.of(2014, 7, 2); + LocalDate maximum = service.getMaximum(date1, date2); assertThat(maximum, is(date2)); } diff --git a/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeDataOnDemand.java index ff65143d..c36c049e 100644 --- a/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeDataOnDemand.java @@ -1,14 +1,13 @@ package de.techdev.trackr.domain.project.billtimes; +import java.time.LocalDate; +import java.time.temporal.ChronoField; + +import org.springframework.beans.factory.annotation.Autowired; + import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.employee.EmployeeDataOnDemand; import de.techdev.trackr.domain.project.ProjectDataOnDemand; -import de.techdev.trackr.domain.project.billtimes.BillableTime; -import de.techdev.trackr.util.LocalDateUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.time.LocalDate; -import java.time.temporal.ChronoField; /** * @author Moritz Schulze @@ -27,7 +26,7 @@ public BillableTime getNewTransientObject(int i) { billableTime.setEmployee(employeeDataOnDemand.getRandomObject()); billableTime.setProject(projectDataOnDemand.getRandomObject()); LocalDate localDate = LocalDate.now().with(ChronoField.DAY_OF_YEAR, (i % 356) + 1); - billableTime.setDate(LocalDateUtil.fromLocalDate(localDate)); + billableTime.setDate(localDate); billableTime.setMinutes(i); return billableTime; } diff --git a/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeResourceTest.java b/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeResourceTest.java index 5a5ff6b0..7aa95ea6 100644 --- a/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/billtimes/BillableTimeResourceTest.java @@ -1,21 +1,27 @@ package de.techdev.trackr.domain.project.billtimes; -import de.techdev.trackr.domain.AbstractDomainResourceTest; -import de.techdev.trackr.domain.project.billtimes.BillableTime; -import org.junit.Ignore; -import org.junit.Test; -import org.springframework.mock.web.MockHttpSession; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isAccessible; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isCreated; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isForbidden; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isMethodNotAllowed; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isNoContent; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isUpdated; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import javax.json.stream.JsonGenerator; import java.io.StringWriter; -import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.function.Function; -import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import javax.json.stream.JsonGenerator; + +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.mock.web.MockHttpSession; + +import de.techdev.trackr.domain.AbstractDomainResourceTest; /** * @author Moritz Schulze @@ -140,9 +146,9 @@ public void findByDateBetweenForbiddenForSupervisor() throws Exception { protected String getJsonRepresentation(BillableTime billableTime) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); jg.writeStartObject() - .write("date", sdf.format(billableTime.getDate())) + .write("date", dtf.format(billableTime.getDate())) .write("minutes", billableTime.getMinutes()) .write("employee", "/employees/" + billableTime.getEmployee().getId()) .write("project", "/projects/" + billableTime.getProject().getId()); diff --git a/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceDataOnDemand.java index 162bfc24..0ec0f99f 100644 --- a/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceDataOnDemand.java @@ -2,10 +2,11 @@ import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.company.CompanyDataOnDemand; + import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; -import java.util.Date; +import java.time.LocalDate; /** * @author Moritz Schulze @@ -19,9 +20,9 @@ public class InvoiceDataOnDemand extends AbstractDataOnDemand { public Invoice getNewTransientObject(int i) { Invoice invoice = new Invoice(); invoice.setIdentifier("identifier_" + i); - invoice.setCreationDate(new Date()); + invoice.setCreationDate(LocalDate.now()); invoice.setDebitor(companyDataOnDemand.getRandomObject()); - invoice.setDueDate(new Date()); + invoice.setDueDate(LocalDate.now()); invoice.setInvoiceState(Invoice.InvoiceState.OUTSTANDING); invoice.setInvoiceTotal(BigDecimal.ONE); return invoice; diff --git a/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandlerTest.java b/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandlerTest.java index c6a7b1f2..23c2fdba 100644 --- a/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandlerTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceEventHandlerTest.java @@ -1,7 +1,6 @@ package de.techdev.trackr.domain.project.invoice; import de.techdev.trackr.domain.company.Company; -import de.techdev.trackr.util.LocalDateUtil; import org.junit.Before; import org.junit.Test; @@ -23,7 +22,7 @@ public void setUp() throws Exception { public void testSetInvoiceStateIfNecessaryOverdue() throws Exception { Invoice invoice = new Invoice(); LocalDate dueDate = LocalDate.of(2013, 10, 1); - invoice.setDueDate(LocalDateUtil.fromLocalDate(dueDate)); + invoice.setDueDate(dueDate); invoiceEventHandler.setInvoiceStateIfNecessary(invoice); assertThat(invoice.getInvoiceState(), is(Invoice.InvoiceState.OVERDUE)); } @@ -32,7 +31,7 @@ public void testSetInvoiceStateIfNecessaryOverdue() throws Exception { public void testSetInvoiceStateIfNecessaryOutstanding() throws Exception { Invoice invoice = new Invoice(); LocalDate dueDate = LocalDate.now().plusDays(7); - invoice.setDueDate(LocalDateUtil.fromLocalDate(dueDate)); + invoice.setDueDate(dueDate); invoiceEventHandler.setInvoiceStateIfNecessary(invoice); assertThat(invoice.getInvoiceState(), is(Invoice.InvoiceState.OUTSTANDING)); } @@ -43,10 +42,10 @@ public void testSetDueDateFromTimeForPayment() throws Exception { Company company = new Company(); company.setTimeForPayment(14); invoice.setDebitor(company); - invoice.setCreationDate(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 1))); + invoice.setCreationDate(LocalDate.of(2014, 1, 1)); invoiceEventHandler.setDueDateFromTimeForPayment(invoice); - assertThat(invoice.getDueDate(), is(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 15)))); + assertThat(invoice.getDueDate(), is(LocalDate.of(2014, 1, 15))); } @Test @@ -55,17 +54,17 @@ public void testDontSetDueDateFromTimeForPaymentIfItIsFilled() throws Exception Company company = new Company(); company.setTimeForPayment(14); invoice.setDebitor(company); - invoice.setCreationDate(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 1))); - invoice.setDueDate(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 2))); + invoice.setCreationDate(LocalDate.of(2014, 1, 1)); + invoice.setDueDate(LocalDate.of(2014, 1, 2)); invoiceEventHandler.setDueDateFromTimeForPayment(invoice); - assertThat(invoice.getDueDate(), is(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 2)))); + assertThat(invoice.getDueDate(), is(LocalDate.of(2014, 1, 2))); } @Test public void testSetDueDateFromTimeForPaymentDontFailOnNoDebitor() throws Exception { Invoice invoice = new Invoice(); - invoice.setCreationDate(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 1))); + invoice.setCreationDate(LocalDate.of(2014, 1, 1)); invoiceEventHandler.setDueDateFromTimeForPayment(invoice); } @@ -74,7 +73,7 @@ public void testSetDueDateFromTimeForPaymentDontFailOnNoTimeForPayment() throws Invoice invoice = new Invoice(); Company company = new Company(); invoice.setDebitor(company); - invoice.setCreationDate(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 1))); + invoice.setCreationDate(LocalDate.of(2014, 1, 1)); invoiceEventHandler.setDueDateFromTimeForPayment(invoice); } @@ -85,10 +84,10 @@ public void stateGetsSetToOverdueIfTimeForPaymentSetsDueDateInPast() throws Exce Company company = new Company(); company.setTimeForPayment(14); invoice.setDebitor(company); - invoice.setCreationDate(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 1))); + invoice.setCreationDate(LocalDate.of(2014, 1, 1)); invoiceEventHandler.authorizeCreate(invoice); - assertThat(invoice.getDueDate(), is(LocalDateUtil.fromLocalDate(LocalDate.of(2014, 1, 15)))); + assertThat(invoice.getDueDate(), is(LocalDate.of(2014, 1, 15))); assertThat(invoice.getInvoiceState(), is(Invoice.InvoiceState.OVERDUE)); } } \ No newline at end of file diff --git a/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceResourceTest.java b/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceResourceTest.java index 28223fa0..e5a3adde 100644 --- a/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/invoice/InvoiceResourceTest.java @@ -2,15 +2,19 @@ import de.techdev.trackr.core.security.AuthorityMocks; import de.techdev.trackr.domain.AbstractDomainResourceTest; + import org.junit.Test; import org.springframework.security.core.context.SecurityContextHolder; import javax.json.stream.JsonGenerator; + import java.io.StringWriter; -import java.text.SimpleDateFormat; + + import java.util.Date; import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -32,15 +36,14 @@ protected String getJsonRepresentation(Invoice invoice) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); jg.writeStartObject() .write("identifier", invoice.getIdentifier()) .write("invoiceState", invoice.getInvoiceState().toString()) .write("invoiceTotal", invoice.getInvoiceTotal()) .write("debitor", "/companies/" + invoice.getDebitor().getId()) - .write("creationDate", sdf.format(invoice.getCreationDate())); + .write("creationDate", ISO_LOCAL_DATE.format(invoice.getCreationDate())); if (invoice.getDueDate() != null) { - jg.write("dueDate", sdf.format(invoice.getDueDate())); + jg.write("dueDate", ISO_LOCAL_DATE.format(invoice.getDueDate())); } if (invoice.getId() != null) { jg.write("id", invoice.getId()); diff --git a/src/test/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTimeTest.java b/src/test/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTimeTest.java index ce3528b9..4f7c0124 100644 --- a/src/test/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTimeTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/worktimes/CustomWorkTimeTest.java @@ -1,18 +1,15 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.domain.project.worktimes.CustomWorkTime; -import de.techdev.trackr.domain.project.worktimes.WorkTime; -import org.junit.Test; +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; -import java.sql.Time; import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; -import static java.util.Arrays.asList; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; +import org.junit.Test; /** * @author Moritz Schulze @@ -27,15 +24,14 @@ public void reduceAndSortWorktimes() throws Exception { } private List createCustomWorkTimes() throws ParseException { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); CustomWorkTime ctw1 = new CustomWorkTime(); - ctw1.setDate(sdf.parse("2014-01-01")); + ctw1.setDate( LocalDate.parse("2014-01-01")); ctw1.setEnteredMinutes(240L); CustomWorkTime ctw2 = new CustomWorkTime(); - ctw2.setDate(sdf.parse("2014-01-01")); + ctw2.setDate(LocalDate.parse("2014-01-01")); ctw2.setEnteredMinutes(60L); CustomWorkTime ctw3 = new CustomWorkTime(); - ctw3.setDate(sdf.parse("2014-01-02")); + ctw3.setDate(LocalDate.parse("2014-01-02")); ctw3.setEnteredMinutes(480L); return asList(ctw1, ctw2, ctw3); } @@ -43,9 +39,9 @@ private List createCustomWorkTimes() throws ParseException { @Test public void customWorkTimeHourCalculation() throws Exception { WorkTime workTime21 = new WorkTime(); - workTime21.setDate(new Date()); - workTime21.setStartTime(Time.valueOf("09:00:00")); - workTime21.setEndTime(Time.valueOf("17:00:00")); + workTime21.setDate(LocalDate.now()); + workTime21.setStartTime( LocalTime.parse("09:00:00")); + workTime21.setEndTime(LocalTime.parse("17:00:00")); CustomWorkTime customWorkTime = CustomWorkTime.valueOf(workTime21); assertThat(customWorkTime.getEnteredMinutes(), is(480L)); } diff --git a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeControllerTest.java b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeControllerTest.java index 18cbc22f..02c285e6 100644 --- a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeControllerTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeControllerTest.java @@ -1,6 +1,18 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.domain.employee.Employee; +import static java.util.Arrays.asList; +import static org.echocat.jomon.testing.BaseMatchers.isNotNull; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -10,18 +22,7 @@ import org.springframework.hateoas.EntityLinks; import org.springframework.hateoas.Link; -import java.sql.Time; -import java.text.SimpleDateFormat; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static java.util.Arrays.asList; -import static org.echocat.jomon.testing.BaseMatchers.isNotNull; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import de.techdev.trackr.domain.employee.Employee; /** * @author Moritz Schulze @@ -49,7 +50,6 @@ public void convertStreamOfWorkTimesToMap() throws Exception { } private List createTestWorktimes() throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Employee employee1 = new Employee(); employee1.setId(1L); employee1.setFirstName("employee_1"); @@ -62,21 +62,21 @@ private List createTestWorktimes() throws Exception { WorkTime workTime11 = new WorkTime(); workTime11.setEmployee(employee1); - workTime11.setDate(sdf.parse("2014-01-01")); - workTime11.setStartTime(Time.valueOf("09:00:00")); - workTime11.setEndTime(Time.valueOf("15:00:00")); + workTime11.setDate(LocalDate.parse("2014-01-01")); + workTime11.setStartTime(LocalTime.parse("09:00:00")); + workTime11.setEndTime(LocalTime.parse("15:00:00")); WorkTime workTime12 = new WorkTime(); workTime12.setEmployee(employee1); - workTime12.setDate(sdf.parse("2014-02-02")); - workTime12.setStartTime(Time.valueOf("16:00:00")); - workTime12.setEndTime(Time.valueOf("17:00:00")); + workTime12.setDate(LocalDate.parse("2014-02-02")); + workTime12.setStartTime(LocalTime.parse("16:00:00")); + workTime12.setEndTime(LocalTime.parse("17:00:00")); WorkTime workTime21 = new WorkTime(); workTime21.setEmployee(employee2); - workTime21.setDate(sdf.parse("2014-01-01")); - workTime21.setStartTime(Time.valueOf("09:00:00")); - workTime21.setEndTime(Time.valueOf("17:00:00")); + workTime21.setDate(LocalDate.parse("2014-01-01")); + workTime21.setStartTime(LocalTime.parse("09:00:00")); + workTime21.setEndTime(LocalTime.parse("17:00:00")); return asList(workTime11, workTime12, workTime21); } } diff --git a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeDataOnDemand.java b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeDataOnDemand.java index f7c10bf5..bb662e1d 100644 --- a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeDataOnDemand.java +++ b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeDataOnDemand.java @@ -1,13 +1,13 @@ package de.techdev.trackr.domain.project.worktimes; +import java.time.LocalDate; +import java.time.LocalTime; + +import org.springframework.beans.factory.annotation.Autowired; + import de.techdev.trackr.domain.AbstractDataOnDemand; import de.techdev.trackr.domain.employee.EmployeeDataOnDemand; import de.techdev.trackr.domain.project.ProjectDataOnDemand; -import de.techdev.trackr.domain.project.worktimes.WorkTime; -import org.springframework.beans.factory.annotation.Autowired; - -import java.sql.Time; -import java.util.Date; /** * @author Moritz Schulze @@ -30,9 +30,9 @@ public WorkTime getNewTransientObject(int i) { WorkTime workTime = new WorkTime(); workTime.setEmployee(employeeDataOnDemand.getRandomObject()); workTime.setProject(projectDataOnDemand.getRandomObject()); - workTime.setDate(new Date()); - workTime.setStartTime(Time.valueOf("09:00:00")); - workTime.setEndTime(Time.valueOf("17:00:00")); + workTime.setDate(LocalDate.now()); + workTime.setStartTime(LocalTime.parse("09:00:00")); + workTime.setEndTime(LocalTime.parse("17:00:00")); workTime.setComment("comment_" + i); return workTime; } diff --git a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepositoryTest.java b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepositoryTest.java index 4704d75f..c639dc50 100644 --- a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepositoryTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeRepositoryTest.java @@ -1,16 +1,18 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.TransactionalIntegrationTest; +import static org.echocat.jomon.testing.BaseMatchers.isGreaterThanOrEqualTo; +import static org.echocat.jomon.testing.BaseMatchers.isNotEmpty; +import static org.echocat.jomon.testing.BaseMatchers.isNotNull; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.time.LocalDate; +import java.util.List; + import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -import static org.echocat.jomon.testing.BaseMatchers.*; -import static org.hamcrest.MatcherAssert.assertThat; +import de.techdev.trackr.TransactionalIntegrationTest; /** * @author Moritz Schulze @@ -55,16 +57,16 @@ public void findByEmployeeAndDate() throws Exception { */ @Test public void findByEmployeeAndDateOnlyRespectsDatePart() throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + //TODO obsolete WorkTime workTime1 = workTimeRepository.findOne(20L); - workTime1.setDate(sdf.parse("2014-03-04 10:00")); + workTime1.setDate(LocalDate.parse("2014-03-04")); workTimeRepository.save(workTime1); WorkTime workTime2 = workTimeRepository.findOne(21L); workTime2.setEmployee(workTime1.getEmployee()); - workTime2.setDate(sdf.parse("2014-03-04 11:00")); + workTime2.setDate(LocalDate.parse("2014-03-04")); workTimeRepository.save(workTime2); - List workTimes = workTimeRepository.findByEmployeeAndDateOrderByStartTimeAsc(workTime1.getEmployee(), sdf.parse("2014-03-04 09:00:00")); + List workTimes = workTimeRepository.findByEmployeeAndDateOrderByStartTimeAsc(workTime1.getEmployee(), LocalDate.parse("2014-03-04")); assertThat(workTimes.size(), isGreaterThanOrEqualTo(2)); } @@ -74,7 +76,7 @@ public void findByEmployeeAndDateBetweenOrderByDateAscStartTimeAsc() throws Exce WorkTime workTime2 = workTimeRepository.findOne(21L); workTime2.setEmployee(workTime1.getEmployee()); workTimeRepository.save(workTime2); - Date low, high; + LocalDate low, high; if(workTime1.getDate().compareTo(workTime2.getDate()) <= 0) { low = workTime1.getDate(); high = workTime2.getDate(); @@ -92,7 +94,7 @@ public void findByProjectAndDateBetweenOrderByDateAscStartTimeAsc() throws Excep WorkTime workTime2 = workTimeRepository.findOne(21L); workTime2.setProject(workTime1.getProject()); workTimeRepository.save(workTime2); - Date low, high; + LocalDate low, high; if(workTime1.getDate().compareTo(workTime2.getDate()) <= 0) { low = workTime1.getDate(); high = workTime2.getDate(); diff --git a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeResourceTest.java b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeResourceTest.java index 894608f7..0aba8c0f 100644 --- a/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeResourceTest.java +++ b/src/test/java/de/techdev/trackr/domain/project/worktimes/WorkTimeResourceTest.java @@ -1,29 +1,38 @@ package de.techdev.trackr.domain.project.worktimes; -import de.techdev.trackr.domain.AbstractDomainResourceTest; -import de.techdev.trackr.domain.project.worktimes.WorkTime; -import org.junit.Ignore; -import org.junit.Test; -import org.springframework.mock.web.MockHttpSession; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isAccessible; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isCreated; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isForbidden; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isMethodNotAllowed; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isNoContent; +import static de.techdev.trackr.domain.DomainResourceTestMatchers.isUpdated; +import static org.echocat.jomon.testing.BaseMatchers.isNotNull; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import javax.json.stream.JsonGenerator; import java.io.StringWriter; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.function.Function; -import static de.techdev.trackr.domain.DomainResourceTestMatchers.*; -import static org.echocat.jomon.testing.BaseMatchers.isNotNull; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import javax.json.stream.JsonGenerator; + +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.mock.web.MockHttpSession; + +import de.techdev.trackr.domain.AbstractDomainResourceTest; /** * @author Moritz Schulze */ public class WorkTimeResourceTest extends AbstractDomainResourceTest { + static final DateTimeFormatter LOCAL_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final Function sameEmployeeSessionProvider; private final Function otherEmployeeSessionProvider; @@ -130,12 +139,11 @@ public void updateProjectForbiddenForSupervisor() throws Exception { @Test public void findByEmployeeAndDateOrderByStartTimeAscAllowedForOwner() throws Exception { WorkTime workTime = dataOnDemand.getRandomObject(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); mockMvc.perform( get("/workTimes/search/findByEmployeeAndDateOrderByStartTimeAsc") .session(employeeSession(workTime.getEmployee().getId())) .param("employee", workTime.getEmployee().getId().toString()) - .param("date", sdf.format(workTime.getDate()))) + .param("date", LOCAL_DATE_FORMAT.format(workTime.getDate()))) .andExpect(status().isOk()) .andExpect(jsonPath("_embedded.workTimes[0].id", isNotNull())); } @@ -143,12 +151,11 @@ public void findByEmployeeAndDateOrderByStartTimeAscAllowedForOwner() throws Exc @Test public void findByEmployeeAndDateOrderByStartTimeAscAllowedForSupervisor() throws Exception { WorkTime workTime = dataOnDemand.getRandomObject(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); mockMvc.perform( get("/workTimes/search/findByEmployeeAndDateOrderByStartTimeAsc") .session(supervisorSession()) .param("employee", workTime.getEmployee().getId().toString()) - .param("date", sdf.format(workTime.getDate()))) + .param("date", LOCAL_DATE_FORMAT.format(workTime.getDate()))) .andExpect(status().isOk()) .andExpect(jsonPath("_embedded.workTimes[0].id", isNotNull())); } @@ -179,7 +186,7 @@ public void findByEmployeeAndDateBetweenOrderByDateAscStartTimeAscAllowedForOwne WorkTime workTime2 = dataOnDemand.getRandomObject(); workTime2.setEmployee(workTime1.getEmployee()); repository.save(workTime2); - Date low, high; + LocalDate low, high; if(workTime1.getDate().compareTo(workTime2.getDate()) <= 0) { low = workTime1.getDate(); high = workTime2.getDate(); @@ -187,13 +194,12 @@ public void findByEmployeeAndDateBetweenOrderByDateAscStartTimeAscAllowedForOwne low = workTime2.getDate(); high = workTime1.getDate(); } - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); mockMvc.perform( get("/workTimes/search/findByEmployeeAndDateBetweenOrderByDateAscStartTimeAsc") .session(employeeSession(workTime1.getEmployee().getId())) .param("employee", workTime1.getEmployee().getId().toString()) - .param("start", sdf.format(low)) - .param("end", sdf.format(high))) + .param("start", LOCAL_DATE_FORMAT.format(low)) + .param("end", LOCAL_DATE_FORMAT.format(high))) .andExpect(status().isOk()) .andExpect(jsonPath("_embedded.workTimes[0].id", isNotNull())); } @@ -204,7 +210,7 @@ public void findByEmployeeAndDateBetweenOrderByDateAscStartTimeAscAllowedForSupe WorkTime workTime2 = dataOnDemand.getRandomObject(); workTime2.setEmployee(workTime1.getEmployee()); repository.save(workTime2); - Date low, high; + LocalDate low, high; if(workTime1.getDate().compareTo(workTime2.getDate()) <= 0) { low = workTime1.getDate(); high = workTime2.getDate(); @@ -212,13 +218,12 @@ public void findByEmployeeAndDateBetweenOrderByDateAscStartTimeAscAllowedForSupe low = workTime2.getDate(); high = workTime1.getDate(); } - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); mockMvc.perform( get("/workTimes/search/findByEmployeeAndDateBetweenOrderByDateAscStartTimeAsc") .session(supervisorSession()) .param("employee", workTime1.getEmployee().getId().toString()) - .param("start", sdf.format(low)) - .param("end", sdf.format(high))) + .param("start", LOCAL_DATE_FORMAT.format(low)) + .param("end", LOCAL_DATE_FORMAT.format(high))) .andExpect(status().isOk()) .andExpect(jsonPath("_embedded.workTimes[0].id", isNotNull())); } @@ -267,7 +272,7 @@ public void findByProjectAndDateBetweenOrderByDateAscStartTimeAscAllowedForSuper WorkTime workTime2 = dataOnDemand.getRandomObject(); workTime2.setProject(workTime1.getProject()); repository.save(workTime2); - Date low, high; + LocalDate low, high; if(workTime1.getDate().compareTo(workTime2.getDate()) <= 0) { low = workTime1.getDate(); high = workTime2.getDate(); @@ -275,13 +280,12 @@ public void findByProjectAndDateBetweenOrderByDateAscStartTimeAscAllowedForSuper low = workTime2.getDate(); high = workTime1.getDate(); } - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); mockMvc.perform( get("/workTimes/search/findByProjectAndDateBetweenOrderByDateAscStartTimeAsc") .session(supervisorSession()) .param("project", workTime1.getProject().getId().toString()) - .param("start", sdf.format(low)) - .param("end", sdf.format(high))) + .param("start", LOCAL_DATE_FORMAT.format(low)) + .param("end", LOCAL_DATE_FORMAT.format(high))) .andExpect(status().isOk()) .andExpect(jsonPath("_embedded.workTimes[0].id", isNotNull())); } @@ -303,9 +307,9 @@ public void findByProjectAndDateBetweenOrderByDateAscStartTimeAscForbiddenForEmp protected String getJsonRepresentation(WorkTime workTime) { StringWriter writer = new StringWriter(); JsonGenerator jg = jsonGeneratorFactory.createGenerator(writer); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); jg.writeStartObject() - .write("date", sdf.format(workTime.getDate())) + .write("date", dtf.format(workTime.getDate())) .write("startTime", workTime.getStartTime().toString()) .write("endTime", workTime.getEndTime().toString()) .write("employee", "/employees/" + workTime.getEmployee().getId()) diff --git a/src/test/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTriggerTest.java b/src/test/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTriggerTest.java index 6a365794..fc14b7b0 100644 --- a/src/test/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTriggerTest.java +++ b/src/test/java/de/techdev/trackr/domain/scheduling/LastWorkdayDayOfMonthTriggerTest.java @@ -19,7 +19,6 @@ import java.util.Date; import java.util.List; -import static de.techdev.trackr.util.LocalDateUtil.fromDate; import static de.techdev.trackr.util.LocalDateUtil.fromLocalDate; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; @@ -44,13 +43,13 @@ public class LastWorkdayDayOfMonthTriggerTest { public void setUp() throws Exception { lastWorkdayDayOfMonthTrigger.setFederalState(FederalState.BERLIN); Holiday holiday = new Holiday(); - holiday.setDay(fromLocalDate(LocalDate.of(2014, 5, 1))); + holiday.setDay(LocalDate.of(2014, 5, 1)); List holidayList = new ArrayList<>(); holidayList.add(holiday); when(holidayRepository.findByFederalStateAndDayBetween(Matchers.any(), Matchers.any(), Matchers.any())).thenReturn(holidayList); holidays = new ArrayList<>(); - holidays.add(fromDate(holiday.getDay())); + holidays.add(holiday.getDay()); } @Test diff --git a/src/test/java/de/techdev/trackr/domain/translations/TranslationControllerTest.java b/src/test/java/de/techdev/trackr/domain/translations/TranslationControllerTest.java index f70ed37a..762c8c4c 100644 --- a/src/test/java/de/techdev/trackr/domain/translations/TranslationControllerTest.java +++ b/src/test/java/de/techdev/trackr/domain/translations/TranslationControllerTest.java @@ -7,8 +7,6 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse;