-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTimeEntryRepository.java
More file actions
133 lines (116 loc) · 5.19 KB
/
Copy pathTimeEntryRepository.java
File metadata and controls
133 lines (116 loc) · 5.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package ch.fhnw.timerecordingbackend.repository;
import ch.fhnw.timerecordingbackend.model.TimeEntry;
import ch.fhnw.timerecordingbackend.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
/**
* Repository für Zeiteinträge Entitäten
* @author PD
* Code von anderen Teammitgliedern oder Quellen wird durch einzelne Kommentare deklariert
* @version 1.0
*/
@Repository
public interface TimeEntryRepository extends JpaRepository<TimeEntry, Long> {
/**
* Liefert alle Zeiteinträge eines Benutzers zurück.
* @param user
* @return Liste mit Zeiteinträgen eines Benutzers.
*/
List<TimeEntry> findByUser(User user);
/**
* Liefert einen Zeiteintrag zurück mit bestimmtem Benutzer und Datum.
* @param user
* @param date
* @return Optional mit Zeiteintrag, wenn gefunden, sonst Optional.empty()
*/
Optional<TimeEntry> findByUserAndDate(User user, LocalDate date);
/**
* Liefert alle Zeiteinträge eines Projekts zurück.
* @param projectId
* @return Liste mit Zeiteinträgen eines Projekts.
*/
List<TimeEntry> findByProjectId(Long projectId);
/**
* Liefert alle Zeiteinträge eines Benutzers für ein bestimmtes Projekt zurück.
* @param user
* @param projectId
* @return Liste mit Zeiteinträgen eines Benutzers für ein bestimmtes Projekt.
*/
List<TimeEntry> findByUserAndProjectId(User user, Long projectId);
/**
* Liefert alle Zeiteinträge für ein bestimmtes Datum zurück.
* @param date
* @return Liste mit Zeiteinträgen für ein bestimmtes Datum.
*/
List<TimeEntry> findByDate(LocalDate date);
/**
* Prüft ob ein Zeiteintrag für einen bestimmten Benutzer und einem bestimmten Datum existiert.
* @param user
* @param date
* @return true, wenn Zeiteintrag existiert, sonst false
*/
boolean existsByUserAndDate(User user, LocalDate date);
/**
* Liefert alle Zeiteinträge ohne Projekt zurück.
* @return Liste mit Zeiteinträgen ohne Projekt.
*/
List<TimeEntry> findByProjectIsNull();
/**
* Summe der tatsächlichen Arbeitsstunden eines Benutzers für einen bestimmten Zeitraum zurück.
* @param userId
* @param startDate
* @param endDate
* @return String mit der Summe der tatsächlichen Arbeitsstunden eines Benutzers für einen bestimmten Zeitraum.
* Quelle: ChatGPT.com
*/
@Query("SELECT SUM(t.actualHours) FROM TimeEntry t WHERE t.user.id = :userId AND t.date BETWEEN :startDate AND :endDate")
String sumActualHoursByUserIdAndDateBetween(@Param("userId") Long userId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
/**
* Summe der geplanten Arbeitsstunden eines Benutzers für einen bestimmten Zeitraum zurück.
* @param userId
* @param startDate
* @param endDate
* @return String mit der Summe der geplanten Arbeitsstunden eines Benutzers für einen bestimmten Zeitraum.
* Quelle: ChatGPT.com
*/
@Query("SELECT SUM(t.plannedHours) FROM TimeEntry t WHERE t.user.id = :userId AND t.date BETWEEN :startDate AND :endDate")
String sumPlannedHoursByUserIdAndDateBetween(@Param("userId") Long userId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
/**
* Liefert alle aktiven Zeiteinträge eines Benutzers zurück.
* @param userId
* @return Liste mit aktiven Zeiteinträgen eines Benutzers.
* Quelle: ChatGPT.com
*/
@Query("SELECT t FROM TimeEntry t WHERE t.user.id = :userId AND SIZE(t.startTimes) > SIZE(t.endTimes)")
List<TimeEntry> findActiveEntriesByUserId(@Param("userId") Long userId);
/**
* Anzahl der Arbeits-Tage eines Benutzers für einen bestimmten Zeitraum zurück.
* @param userId
* @param startDate
* @param endDate
* @return Anzahl der Arbeits-Tage eines Benutzers für einen bestimmten Zeitraum.
* Quelle: ChatGPT.com
*/
@Query("SELECT COUNT(DISTINCT t.date) FROM TimeEntry t WHERE t.user.id = :userId AND t.date BETWEEN :startDate AND :endDate")
long countWorkdaysByUserIdAndDateBetween(@Param("userId") Long userId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
/**
* Summe aller tatsächlichen Stunden für ein Projekt berechnen
* @param projectId
* @return
* Quelle: ChatGPT.com
*/
@Query(value = "SELECT COALESCE(SUM(EXTRACT(HOUR FROM TO_TIMESTAMP(t.actual_hours, 'HH24:MI')) * 60 + EXTRACT(MINUTE FROM TO_TIMESTAMP(t.actual_hours, 'HH24:MI'))), 0) FROM time_entries t WHERE t.project_id = :projectId", nativeQuery = true)
List<Object[]> sumActualHoursByProjectId(@Param("projectId") Long projectId);
/**
* Benutzer anhand Zeiteinträge für ein Projekt finden
* @param projectId
* @return
*/
@Query("SELECT DISTINCT t.user FROM TimeEntry t WHERE t.project.id = :projectId")
List<User> findDistinctUsersByProjectId(@Param("projectId") Long projectId);
}