|
@@ -228,6 +228,67 @@ open class DashboardService( |
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fun searchCustomerFromFinancialSummary(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
|
|
|
val sql = StringBuilder("select" |
|
|
|
|
|
+ " ROW_NUMBER() OVER (ORDER BY p.id, p.code, p.name, te.code, s.name, p.totalManhour, milestonePayment.comingPaymentMilestone) AS id," |
|
|
|
|
|
+ " p.id as id," |
|
|
|
|
|
+ " p.id as projectId," |
|
|
|
|
|
+ " p.code as projectCode," |
|
|
|
|
|
+ " p.name as projectName," |
|
|
|
|
|
+ " te.code as team," |
|
|
|
|
|
+ " s.name as teamLead," |
|
|
|
|
|
+ " taskGroup.expectedStage," |
|
|
|
|
|
+ " p.totalManhour as budgetedManhour," |
|
|
|
|
|
+ " COALESCE (sum(t.normalConsumed) + sum(t.otConsumed),0) as spentManhour," |
|
|
|
|
|
+ " COALESCE (p.totalManhour - sum(t.normalConsumed) - sum(t.otConsumed),0) as remainedManhour," |
|
|
|
|
|
+ " coalesce (round(((sum(t.normalConsumed) + sum(t.otConsumed))/p.totalManhour)*100,2),0) as manhourConsumptionPercentage," |
|
|
|
|
|
+ " COALESCE (DATE_FORMAT(milestonePayment.comingPaymentMilestone, '%Y-%m-%d'),'NA') as comingPaymentMilestone," |
|
|
|
|
|
+ " case" |
|
|
|
|
|
+ " when COALESCE (p.totalManhour - sum(t.normalConsumed) - sum(t.otConsumed),0) > 0 then 0" |
|
|
|
|
|
+ " when COALESCE (p.totalManhour - sum(t.normalConsumed) - sum(t.otConsumed),0) <= 0 then 1" |
|
|
|
|
|
+ " end as alert" |
|
|
|
|
|
+ " 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 team te on p.teamLead = te.teamLead" |
|
|
|
|
|
+ " left join staff s on te.teamLead = s.id" |
|
|
|
|
|
+ " left join (" |
|
|
|
|
|
+ " select " |
|
|
|
|
|
+ " m.projectId," |
|
|
|
|
|
+ " GROUP_CONCAT(DISTINCT tg.name ORDER BY tg.name) as expectedStage" |
|
|
|
|
|
+ " from milestone m" |
|
|
|
|
|
+ " left join task_group tg on m.taskGroupId = tg.id" |
|
|
|
|
|
+ " where curdate() >= m.startDate and curdate() <= m.endDate" |
|
|
|
|
|
+ " group by m.projectId" |
|
|
|
|
|
+ " ) taskGroup on p.id = taskGroup.projectId" |
|
|
|
|
|
+ " left join (" |
|
|
|
|
|
+ " SELECT pid, MIN(comingPaymentMilestone) AS comingPaymentMilestone" |
|
|
|
|
|
+ " FROM (" |
|
|
|
|
|
+ " SELECT p.id AS pid, mp.date AS comingPaymentMilestone" |
|
|
|
|
|
+ " FROM project p" |
|
|
|
|
|
+ " LEFT JOIN milestone m ON p.id = m.projectId" |
|
|
|
|
|
+ " LEFT JOIN milestone_payment mp ON m.id = mp.milestoneId" |
|
|
|
|
|
+ " WHERE p.customerId = :customerId" |
|
|
|
|
|
+ " AND p.status NOT IN ('Pending to Start', 'Completed', 'Deleted')" |
|
|
|
|
|
+ " AND mp.date >= CURDATE()" |
|
|
|
|
|
+ " ) AS subquery" |
|
|
|
|
|
+ " GROUP BY pid" |
|
|
|
|
|
+ " ORDER BY comingPaymentMilestone ASC" |
|
|
|
|
|
+ " ) milestonePayment on milestonePayment.pid = p.id" |
|
|
|
|
|
+ " where p.customerId = :customerId" |
|
|
|
|
|
+ " and p.status not in (\"Pending to Start\",\"Completed\",\"Deleted\")" |
|
|
|
|
|
+ " group by p.id, p.code, p.name, te.code, s.name, p.totalManhour, milestonePayment.comingPaymentMilestone, taskGroup.expectedStage" |
|
|
|
|
|
) |
|
|
|
|
|
if (args["tableSorting"] == "ProjectName") { |
|
|
|
|
|
sql.append(" ORDER BY p.name ASC") |
|
|
|
|
|
} else if (args["tableSorting"] == "PercentageASC") { |
|
|
|
|
|
sql.append(" ORDER BY coalesce (round(((sum(t.normalConsumed) + sum(t.otConsumed))/p.totalManhour)*100,2),0) asc") |
|
|
|
|
|
} else if (args["tableSorting"] == "PercentageDESC") { |
|
|
|
|
|
sql.append(" ORDER BY coalesce (round(((sum(t.normalConsumed) + sum(t.otConsumed))/p.totalManhour)*100,2),0) desc") |
|
|
|
|
|
} |
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
open fun getFinancialStatus(): List<Map<String, Any>> { |
|
|
open fun getFinancialStatus(): List<Map<String, Any>> { |
|
|
val sql = StringBuilder( |
|
|
val sql = StringBuilder( |
|
|
" with cte_timesheet as (" |
|
|
" with cte_timesheet as (" |
|
|