|
|
@@ -907,6 +907,111 @@ open class DashboardService( |
|
|
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
|
} |
|
|
|
fun projectResourceSummarySearch(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
|
val sql = StringBuilder("select" |
|
|
|
+ " p.id as id," |
|
|
|
+ " p.code as projectCode," |
|
|
|
+ " p.name as projectName," |
|
|
|
+ " concat(c.code,'-',c.name) as customerCodeAndName" |
|
|
|
+ " from project p" |
|
|
|
+ " left join customer c on p.customerId = c.id" |
|
|
|
+ " where p.status = 'On-going'" |
|
|
|
+ " and p.deleted = 0" |
|
|
|
) |
|
|
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
|
} |
|
|
|
fun projectResourceSummaryInformation(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
|
val sql = StringBuilder("select" |
|
|
|
+ " concat(p.code,'-',p.name) as projectCodeAndName," |
|
|
|
+ " p.expectedTotalFee as totalFee," |
|
|
|
+ " expenditure.expenditure as expenditure," |
|
|
|
+ " case" |
|
|
|
+ " when p.expectedTotalFee - expenditure.expenditure >= 0 then 'Within Budget'" |
|
|
|
+ " when p.expectedTotalFee - expenditure.expenditure < 0 then 'Overconsumption'" |
|
|
|
+ " end as status," |
|
|
|
+ " p.totalManhour as plannedResources," |
|
|
|
+ " sum(t.normalConsumed) + sum(t.otConsumed) as resourcesSpent," |
|
|
|
+ " p.totalManhour - sum(t.normalConsumed) + sum(t.otConsumed) as remainingResources" |
|
|
|
+ " from project p" |
|
|
|
+ " left join project_task pt on p.id = pt.project_id" |
|
|
|
+ " left join timesheet t on pt.id = t.projectTaskId" |
|
|
|
+ " left join(" |
|
|
|
+ " select" |
|
|
|
+ " sum(r.expenditure) as expenditure" |
|
|
|
+ " from(" |
|
|
|
+ " select" |
|
|
|
+ " (coalesce(sum(t.normalConsumed),0) * s2.hourlyRate) + (coalesce(sum(t.otConsumed),0) * s2.hourlyRate * 1.0) as expenditure" |
|
|
|
+ " from project p" |
|
|
|
+ " left join project_task pt on p.id = pt.project_id" |
|
|
|
+ " left join timesheet t on pt.id = t.projectTaskId" |
|
|
|
+ " left join staff s on t.staffId = s.id" |
|
|
|
+ " left join salary s2 on s.salaryId = s2.salaryPoint" |
|
|
|
+ " where t.id is not null" |
|
|
|
+ " and p.id = :projectId" |
|
|
|
+ " group by s2.hourlyRate" |
|
|
|
+ " ) as r" |
|
|
|
+ " ) as expenditure on 1 = 1" |
|
|
|
+ " where p.id = :projectId" |
|
|
|
+ " group by expenditure.expenditure" |
|
|
|
) |
|
|
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
|
} |
|
|
|
fun projectResourceSummaryMainStage(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
|
val sql = StringBuilder("select" |
|
|
|
+ " p.id as projectId," |
|
|
|
+ " tg.id," |
|
|
|
+ " tg.name," |
|
|
|
+ " count(distinct pt.id) as taskCount," |
|
|
|
+ " g.name," |
|
|
|
+ " ifnull(ga.manhour, 0) as plannedResourcesPercentage," |
|
|
|
+ " ifnull(p.totalManhour, 0) * ifnull(ga.manhour, 0) / 100 as plannedResources," |
|
|
|
+ " ifnull(p.totalManhour, 0) as totalPlannedResources," |
|
|
|
+ " sum(ifnull(case when s.gradeId = g.id then t.normalConsumed else 0 end, 0) + ifnull(case when s.gradeId = g.id and ga.projectId = p.id then t.otConsumed else 0 end, 0)) as actualResourcesSpent," |
|
|
|
+ " sum(ifnull(t.normalConsumed, 0) + ifnull(t.otConsumed, 0)) as totalActualResourcesSpent" |
|
|
|
+ " from project p" |
|
|
|
+ " left join project_task pt on pt.project_id = p.id" |
|
|
|
+ " left join milestone m on m.projectId = p.id and m.id = pt.milestoneId" |
|
|
|
+ " left join task_group tg on tg.id = m.taskGroupId" |
|
|
|
+ " left join grade_allocation ga ON ga.projectId = p.id" |
|
|
|
+ " left join grade g ON g.id = ga.gradeId" |
|
|
|
+ " left join timesheet t on t.projectTaskId = pt.id" |
|
|
|
+ " left join staff s on s.id = t.staffId" |
|
|
|
+ " where p.deleted = false" |
|
|
|
+ " and p.id = :projectId" |
|
|
|
+ " group by p.id, tg.id, tg.name, g.name, plannedResourcesPercentage, plannedResources" |
|
|
|
+ " order by p.id;" |
|
|
|
) |
|
|
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
|
} |
|
|
|
fun projectResourceSummarySubStage(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
|
val sql = StringBuilder("select" |
|
|
|
+ " p.id as projectId," |
|
|
|
+ " t.id," |
|
|
|
+ " t.taskGroupId as tgId," |
|
|
|
+ " t.name," |
|
|
|
+ " g.name," |
|
|
|
+ " '-' as taskCount," |
|
|
|
+ " '-' as plannedResources," |
|
|
|
+ " '-' as totalPlannedResource," |
|
|
|
+ " sum(ifnull(case when s.gradeId = g.id then ts.normalConsumed else 0 end, 0) + ifnull(case when s.gradeId = g.id and ga.projectId = p.id then ts.otConsumed else 0 end, 0)) as actualResourcesSpent," |
|
|
|
+ " sum(ifnull(ts.normalConsumed, 0) + ifnull(ts.otConsumed, 0)) as totalActualResourcesSpent" |
|
|
|
+ " from project p" |
|
|
|
+ " left join project_task pt on pt.project_id = p.id" |
|
|
|
+ " left join task t on t.id = pt.task_id" |
|
|
|
+ " left join grade_allocation ga on ga.projectId = p.id" |
|
|
|
+ " left join grade g on g.id = ga.gradeId" |
|
|
|
+ " left join timesheet ts on ts.projectTaskId = pt.id" |
|
|
|
+ " left join staff s on s.id = ts.staffId" |
|
|
|
+ " where p.id = :projectId" |
|
|
|
+ " group by p.id, t.id, t.name, g.name" |
|
|
|
+ " order by p.id;" |
|
|
|
) |
|
|
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|