diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt index 29d1c28..68ccecf 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt @@ -43,6 +43,35 @@ class TimesheetsController(private val timesheetsService: TimesheetsService, pri return leaveService.saveLeave(parsedEntries) } + @PostMapping("saveTimeLeave") + fun newTimeLeave(@Valid @RequestBody recordTimeLeave: Map>): Map> { + val parsedEntries = kotlin.runCatching { + recordTimeLeave.mapKeys { (dateString) -> LocalDate.parse(dateString, DateTimeFormatter.ISO_LOCAL_DATE) } + }.getOrElse { throw BadRequestException() } + + val timesheets = parsedEntries.mapValues { (_, entries) -> entries.mapNotNull { timeLeaveEntry -> timeLeaveEntry.toTimeEntry() } } + val leaves = parsedEntries.mapValues { (_, entries) -> entries.mapNotNull { timeLeaveEntry -> timeLeaveEntry.toLeaveEntry() } } + + val savedTimesheets = timesheetsService.saveTimesheet(timesheets) + val savedLeaves = leaveService.saveLeave(leaves) + + val newMap = mutableMapOf>() + savedTimesheets.forEach { (date, entries) -> + if (!newMap.containsKey(date)) { + newMap[date] = mutableListOf() + } + newMap[date]!!.addAll(entries.map { e -> e.toTimeLeaveEntry() }) + } + savedLeaves.forEach { (date, entries) -> + if (!newMap.containsKey(date)) { + newMap[date] = mutableListOf() + } + newMap[date]!!.addAll(entries.map { e -> e.toTimeLeaveEntry() }) + } + + return newMap + } + @GetMapping fun getTimesheetEntry(): Map> { return timesheetsService.getTimesheet() diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/LeaveEntry.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/LeaveEntry.kt index af3a0c5..5b5581f 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/LeaveEntry.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/LeaveEntry.kt @@ -5,4 +5,18 @@ data class LeaveEntry( val leaveTypeId: Long?, val inputHours: Double, val remark: String? -) +) { + fun toTimeLeaveEntry(): TimeLeaveEntry { + return TimeLeaveEntry( + type = "leaveEntry", + id = this.id, + leaveTypeId = this.leaveTypeId, + inputHours = this.inputHours, + remark = this.remark, + projectId = null, + taskGroupId = null, + taskId = null, + otHours = null, + ) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeEntry.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeEntry.kt index 6af3c26..8812f75 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeEntry.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeEntry.kt @@ -9,4 +9,18 @@ data class TimeEntry( val inputHours: Double?, val otHours: Double?, val remark: String? -) \ No newline at end of file +) { + fun toTimeLeaveEntry(): TimeLeaveEntry { + return TimeLeaveEntry( + type = "timeEntry", + id = this.id, + projectId = this.projectId, + taskGroupId = this.taskGroupId, + taskId = this.taskId, + inputHours = this.inputHours, + otHours = this.otHours, + remark = this.remark, + leaveTypeId = null + ) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeLeaveEntry.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeLeaveEntry.kt new file mode 100644 index 0000000..e929bfa --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TimeLeaveEntry.kt @@ -0,0 +1,49 @@ +package com.ffii.tsms.modules.timesheet.web.models + +import jakarta.validation.constraints.AssertTrue + +data class TimeLeaveEntry( + val id: Long, + val type: String, + val projectId: Long?, + val leaveTypeId: Long?, + val taskGroupId: Long?, + val taskId: Long?, + val inputHours: Double?, + val otHours: Double?, + val remark: String?, +) { + @AssertTrue + private fun isValid(): Boolean { + return type == "timeEntry" || (type == "leaveEntry" && leaveTypeId != null) + } + + fun toTimeEntry(): TimeEntry? { + if (type == "leaveEntry") { + return null + } + + return TimeEntry( + id, + projectId, + taskGroupId, + taskId, + inputHours, + otHours, + remark, + ) + } + + fun toLeaveEntry(): LeaveEntry? { + if (type == "timeEntry" || inputHours == null) { + return null + } + + return LeaveEntry( + id, + leaveTypeId, + inputHours, + remark, + ) + } +} \ No newline at end of file