| @@ -68,6 +68,8 @@ open class ProjectsService( | |||||
| staffRepository.findByUserId(user.id).getOrNull()?.let { staff -> | staffRepository.findByUserId(user.id).getOrNull()?.let { staff -> | ||||
| staffAllocationRepository.findAssignedProjectsByStaff(staff) | staffAllocationRepository.findAssignedProjectsByStaff(staff) | ||||
| .mapNotNull { it.project?.let { project -> | .mapNotNull { it.project?.let { project -> | ||||
| val timesheetHours = timesheetRepository.totalHoursConsumedByProject(project) | |||||
| AssignedProject( | AssignedProject( | ||||
| id = project.id!!, | id = project.id!!, | ||||
| code = project.code!!, | code = project.code!!, | ||||
| @@ -82,8 +84,8 @@ open class ProjectsService( | |||||
| ) }, | ) }, | ||||
| hoursAllocated = project.totalManhour ?: 0.0, | hoursAllocated = project.totalManhour ?: 0.0, | ||||
| hoursAllocatedOther = 0.0, | hoursAllocatedOther = 0.0, | ||||
| hoursSpent = timesheetRepository.totalNormalHoursConsumedByProject(project), | |||||
| hoursSpentOther = 0.0 | |||||
| hoursSpent = timesheetHours.normalConsumed, | |||||
| hoursSpentOther = timesheetHours.otConsumed | |||||
| ) | ) | ||||
| } } | } } | ||||
| } | } | ||||
| @@ -3,6 +3,7 @@ package com.ffii.tsms.modules.timesheet.entity; | |||||
| import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
| import com.ffii.tsms.modules.data.entity.Staff | import com.ffii.tsms.modules.data.entity.Staff | ||||
| import com.ffii.tsms.modules.project.entity.Project | import com.ffii.tsms.modules.project.entity.Project | ||||
| import com.ffii.tsms.modules.timesheet.entity.projections.TimesheetHours | |||||
| import org.springframework.data.jpa.repository.Query | import org.springframework.data.jpa.repository.Query | ||||
| import java.time.LocalDate | import java.time.LocalDate | ||||
| @@ -12,6 +13,6 @@ interface TimesheetRepository : AbstractRepository<Timesheet, Long> { | |||||
| fun deleteAllByStaffAndRecordDate(staff: Staff, recordDate: LocalDate) | fun deleteAllByStaffAndRecordDate(staff: Staff, recordDate: LocalDate) | ||||
| @Query("SELECT IFNULL(SUM(normalConsumed), 0) FROM Timesheet t JOIN ProjectTask pt on t.projectTask = pt WHERE pt.project = ?1") | |||||
| fun totalNormalHoursConsumedByProject(project: Project): Double | |||||
| @Query("SELECT new com.ffii.tsms.modules.timesheet.entity.projections.TimesheetHours(IFNULL(SUM(normalConsumed), 0), IFNULL(SUM(otConsumed), 0)) FROM Timesheet t JOIN ProjectTask pt on t.projectTask = pt WHERE pt.project = ?1") | |||||
| fun totalHoursConsumedByProject(project: Project): TimesheetHours | |||||
| } | } | ||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.timesheet.entity.projections | |||||
| data class TimesheetHours( | |||||
| val normalConsumed: Double, | |||||
| val otConsumed: Double | |||||
| ) | |||||
| @@ -12,7 +12,6 @@ import org.springframework.stereotype.Service | |||||
| import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||
| import java.time.LocalDate | import java.time.LocalDate | ||||
| import java.time.format.DateTimeFormatter | import java.time.format.DateTimeFormatter | ||||
| import kotlin.jvm.optionals.getOrDefault | |||||
| import kotlin.jvm.optionals.getOrNull | import kotlin.jvm.optionals.getOrNull | ||||
| @Service | @Service | ||||
| @@ -41,6 +40,7 @@ open class TimesheetsService( | |||||
| this.staff = currentStaff | this.staff = currentStaff | ||||
| this.recordDate = entryDate | this.recordDate = entryDate | ||||
| this.normalConsumed = timeEntry.inputHours | this.normalConsumed = timeEntry.inputHours | ||||
| this.otConsumed = timeEntry.otHours | |||||
| this.projectTask = projectTask | this.projectTask = projectTask | ||||
| this.remark = timeEntry.remark | this.remark = timeEntry.remark | ||||
| } | } | ||||
| @@ -68,6 +68,7 @@ open class TimesheetsService( | |||||
| taskId = timesheet.projectTask?.task?.id, | taskId = timesheet.projectTask?.task?.id, | ||||
| taskGroupId = timesheet.projectTask?.task?.taskGroup?.id, | taskGroupId = timesheet.projectTask?.task?.taskGroup?.id, | ||||
| inputHours = timesheet.normalConsumed ?: 0.0, | inputHours = timesheet.normalConsumed ?: 0.0, | ||||
| otHours = timesheet.otConsumed ?: 0.0, | |||||
| remark = timesheet.remark | remark = timesheet.remark | ||||
| ) | ) | ||||
| } } | } } | ||||
| @@ -77,7 +78,10 @@ open class TimesheetsService( | |||||
| return entries | return entries | ||||
| .groupBy { timeEntry -> Pair(timeEntry.projectId, timeEntry.taskId) } | .groupBy { timeEntry -> Pair(timeEntry.projectId, timeEntry.taskId) } | ||||
| .values.map { timeEntries -> | .values.map { timeEntries -> | ||||
| timeEntries.reduce { acc, timeEntry -> acc.copy(inputHours = acc.inputHours + timeEntry.inputHours) } | |||||
| timeEntries.reduce { acc, timeEntry -> acc.copy( | |||||
| inputHours = (acc.inputHours ?: 0.0) + (timeEntry.inputHours ?: 0.0), | |||||
| otHours = (acc.otHours ?: 0.0) + (timeEntry.otHours ?: 0.0) | |||||
| ) } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -6,6 +6,7 @@ data class TimeEntry( | |||||
| val projectId: Long?, | val projectId: Long?, | ||||
| val taskGroupId: Long?, | val taskGroupId: Long?, | ||||
| val taskId: Long?, | val taskId: Long?, | ||||
| val inputHours: Double, | |||||
| val inputHours: Double?, | |||||
| val otHours: Double?, | |||||
| val remark: String? | val remark: String? | ||||
| ) | ) | ||||