feat: Add excludeFromBilling option for diary dates and update related functionality
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 44s

This commit is contained in:
Torsten Schulz (local)
2026-05-30 16:10:34 +02:00
parent 25f3802d66
commit 9d9481ac76
12 changed files with 208 additions and 25 deletions

View File

@@ -83,15 +83,27 @@ class DiaryApi(
client.http.delete("/api/diary-date-activities/group/$clubId/$groupActivityId")
}
suspend fun createDate(clubId: Int, date: String, trainingStart: String?, trainingEnd: String?): DiaryDate {
suspend fun createDate(
clubId: Int,
date: String,
trainingStart: String?,
trainingEnd: String?,
excludeFromBilling: Boolean = false,
): DiaryDate {
return client.http.post("/api/diary/$clubId") {
setBody(CreateDiaryDateRequest(date, trainingStart, trainingEnd))
setBody(CreateDiaryDateRequest(date, trainingStart, trainingEnd, excludeFromBilling))
}.body()
}
suspend fun updateTimes(clubId: Int, dateId: Int, trainingStart: String?, trainingEnd: String?): DiaryDate {
suspend fun updateTimes(
clubId: Int,
dateId: Int,
trainingStart: String?,
trainingEnd: String?,
excludeFromBilling: Boolean? = null,
): DiaryDate {
return client.http.put("/api/diary/$clubId") {
setBody(UpdateDiaryTimesRequest(dateId, trainingStart, trainingEnd))
setBody(UpdateDiaryTimesRequest(dateId, trainingStart, trainingEnd, excludeFromBilling))
}.body()
}

View File

@@ -9,6 +9,7 @@ data class DiaryDate(
val date: String,
val trainingStart: String? = null,
val trainingEnd: String? = null,
val excludeFromBilling: Boolean = false,
val diaryNotes: List<DiaryNote> = emptyList(),
val diaryTags: List<DiaryTag> = emptyList(),
)
@@ -31,6 +32,7 @@ data class CreateDiaryDateRequest(
val date: String,
val trainingStart: String? = null,
val trainingEnd: String? = null,
val excludeFromBilling: Boolean = false,
)
@Serializable
@@ -38,6 +40,7 @@ data class UpdateDiaryTimesRequest(
val dateId: Int,
val trainingStart: String? = null,
val trainingEnd: String? = null,
val excludeFromBilling: Boolean? = null,
)
@Serializable

View File

@@ -31,6 +31,7 @@ data class DiaryDate(
val clubId: Int,
val trainingStart: String? = null,
val trainingEnd: String? = null,
val excludeFromBilling: Boolean = false,
val activities: List<DiaryActivity> = emptyList(),
val participants: List<Participant> = emptyList()
)

View File

@@ -263,10 +263,16 @@ class DiaryManager(
}
/** @return neue `diaryDateId` bei Erfolg, sonst `null` */
suspend fun createDate(clubId: Int, date: String, trainingStart: String?, trainingEnd: String?): Int? {
suspend fun createDate(
clubId: Int,
date: String,
trainingStart: String?,
trainingEnd: String?,
excludeFromBilling: Boolean = false,
): Int? {
_state.value = _state.value.copy(isLoading = true, error = null)
return try {
val created = diaryApi.createDate(clubId, date, trainingStart, trainingEnd)
val created = diaryApi.createDate(clubId, date, trainingStart, trainingEnd, excludeFromBilling)
loadDates(clubId)
created.id
} catch (t: Throwable) {
@@ -275,10 +281,16 @@ class DiaryManager(
}
}
suspend fun updateTimes(clubId: Int, dateId: Int, trainingStart: String?, trainingEnd: String?) {
suspend fun updateTimes(
clubId: Int,
dateId: Int,
trainingStart: String?,
trainingEnd: String?,
excludeFromBilling: Boolean? = null,
) {
_state.value = _state.value.copy(isLoading = true, error = null)
try {
diaryApi.updateTimes(clubId, dateId, trainingStart, trainingEnd)
diaryApi.updateTimes(clubId, dateId, trainingStart, trainingEnd, excludeFromBilling)
loadDates(clubId)
} catch (t: Throwable) {
_state.value = _state.value.copy(isLoading = false, error = t.toUserMessage("Zeiten konnten nicht gespeichert werden"))