@@ -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? | ||||
) | ) |