|
@@ -397,7 +397,26 @@ open class DashboardService( |
|
|
+ " from team t" |
|
|
+ " from team t" |
|
|
+ " left join project p on t.teamLead = p.teamLead" |
|
|
+ " left join project p on t.teamLead = p.teamLead" |
|
|
+ " left join customer c on p.customerId = c.id" |
|
|
+ " left join customer c on p.customerId = c.id" |
|
|
+ " left join invoice i on p.code = i.projectCode" |
|
|
|
|
|
|
|
|
+ " left join (" |
|
|
|
|
|
+ " select" |
|
|
|
|
|
+ " c3.id as cid," |
|
|
|
|
|
+ " sum(i3.issueAmount) as issueAmount," |
|
|
|
|
|
+ " sum(i3.paidAmount) as paidAmount" |
|
|
|
|
|
+ " from team t3" |
|
|
|
|
|
+ " left join project p3 on t3.teamLead = p3.teamLead" |
|
|
|
|
|
+ " left join customer c3 on p3.customerId = c3.id" |
|
|
|
|
|
+ " left join invoice i3 on p3.code = i3.projectCode" |
|
|
|
|
|
+ " where t3.deleted = 0" |
|
|
|
|
|
+ " and p3.status = 'On-going'" |
|
|
|
|
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
if (args != null) { |
|
|
|
|
|
if (args.containsKey("teamId")) |
|
|
|
|
|
sql.append(" AND t3.id = :teamId"); |
|
|
|
|
|
} |
|
|
|
|
|
sql.append( " group by c3.id" |
|
|
|
|
|
+ " ) as i on i.cid = c.id" |
|
|
+ " left join (" |
|
|
+ " left join (" |
|
|
+ " select" |
|
|
+ " select" |
|
|
+ " r.teamId as teamId," |
|
|
+ " r.teamId as teamId," |
|
@@ -425,8 +444,8 @@ open class DashboardService( |
|
|
+ " group by r.teamId, r.customerId" |
|
|
+ " group by r.teamId, r.customerId" |
|
|
+ " ) as expenditure on expenditure.teamId = t.id and expenditure.customerId = c.id" |
|
|
+ " ) as expenditure on expenditure.teamId = t.id and expenditure.customerId = c.id" |
|
|
+ " where t.deleted = 0" |
|
|
+ " where t.deleted = 0" |
|
|
+ " and p.status = 'On-going'" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
+ " and p.status = 'On-going'") |
|
|
|
|
|
|
|
|
if (args != null) { |
|
|
if (args != null) { |
|
|
if (args.containsKey("teamId")) |
|
|
if (args.containsKey("teamId")) |
|
|
sql.append(" AND t.id = :teamId"); |
|
|
sql.append(" AND t.id = :teamId"); |
|
@@ -635,7 +654,7 @@ open class DashboardService( |
|
|
+ " coalesce (sum(i.paidAmount),0) as totalReceived," |
|
|
+ " coalesce (sum(i.paidAmount),0) as totalReceived," |
|
|
+ " coalesce (sum(i.issueAmount) - sum(i.paidAmount),0) as receivable," |
|
|
+ " coalesce (sum(i.issueAmount) - sum(i.paidAmount),0) as receivable," |
|
|
+ " coalesce (round(sum(p.expectedTotalFee)*0.8,2),0) as totalBudget," |
|
|
+ " coalesce (round(sum(p.expectedTotalFee)*0.8,2),0) as totalBudget," |
|
|
+ " coalesce (expenditure.expenditure) as totalExpenditure," |
|
|
|
|
|
|
|
|
+ " coalesce (expenditure.expenditure,0) as totalExpenditure," |
|
|
+ " coalesce (sum(p.expectedTotalFee)*0.8 - expenditure.expenditure,0) as expenditureReceivable" |
|
|
+ " coalesce (sum(p.expectedTotalFee)*0.8 - expenditure.expenditure,0) as expenditureReceivable" |
|
|
+ " from project p" |
|
|
+ " from project p" |
|
|
+ " left join invoice i on p.code = i.projectCode" |
|
|
+ " left join invoice i on p.code = i.projectCode" |
|
@@ -737,60 +756,62 @@ open class DashboardService( |
|
|
} |
|
|
} |
|
|
fun CashFlowLedger(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
fun CashFlowLedger(args: Map<String, Any>): List<Map<String, Any>> { |
|
|
val sql = StringBuilder("select" |
|
|
val sql = StringBuilder("select" |
|
|
+ " ROW_NUMBER() OVER (ORDER BY date, income, expenditure) AS id," |
|
|
|
|
|
+ " date," |
|
|
|
|
|
+ " COALESCE(ROUND(income, 2), 0) AS income," |
|
|
|
|
|
+ " COALESCE(ROUND(expenditure, 2), 0) AS expenditure," |
|
|
|
|
|
+ " ROUND(SUM(COALESCE(income, 0) - COALESCE(expenditure, 0)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 2) AS balance," |
|
|
|
|
|
+ " CASE" |
|
|
|
|
|
+ " WHEN income > 0 THEN paymentMilestone" |
|
|
|
|
|
+ " ELSE 'Monthly Manpower Expenditure'" |
|
|
|
|
|
+ " END AS remarks" |
|
|
|
|
|
+ " FROM" |
|
|
|
|
|
+ " (" |
|
|
|
|
|
+ " SELECT" |
|
|
|
|
|
+ " date_format(i.receiptDate, '%b %y') AS date," |
|
|
|
|
|
+ " sum(i.paidAmount) AS income," |
|
|
|
|
|
+ " NULL AS expenditure," |
|
|
|
|
|
+ " i.paymentMilestone AS paymentMilestone" |
|
|
|
|
|
+ " FROM" |
|
|
|
|
|
+ " project p" |
|
|
|
|
|
+ " LEFT JOIN invoice i ON p.code = i.projectCode" |
|
|
|
|
|
+ " WHERE" |
|
|
|
|
|
+ " p.id IN (:projectIds)" |
|
|
|
|
|
+ " AND i.paidAmount IS NOT NULL" |
|
|
|
|
|
+ " GROUP BY" |
|
|
|
|
|
+ " date_format(i.receiptDate, '%b %y')," |
|
|
|
|
|
+ " i.paymentMilestone" |
|
|
|
|
|
+ " UNION" |
|
|
|
|
|
+ " SELECT" |
|
|
|
|
|
+ " date_format(r.date, '%b %y') AS date," |
|
|
|
|
|
+ " NULL AS income," |
|
|
|
|
|
+ " sum(r.expenditure) AS expenditure," |
|
|
|
|
|
+ " NULL AS paymentMilestone" |
|
|
|
|
|
+ " FROM" |
|
|
|
|
|
+ " (" |
|
|
|
|
|
+ " SELECT" |
|
|
|
|
|
+ " t.recordDate AS date," |
|
|
|
|
|
+ " (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 IN (:projectIds)" |
|
|
|
|
|
+ " GROUP BY" |
|
|
|
|
|
+ " s2.hourlyRate," |
|
|
|
|
|
+ " t.recordDate" |
|
|
|
|
|
+ " ) AS r" |
|
|
|
|
|
+ " GROUP BY" |
|
|
|
|
|
+ " date_format(r.date, '%b %y')" |
|
|
|
|
|
+ " ) AS combined_data" |
|
|
|
|
|
+ " ORDER BY" |
|
|
|
|
|
+ " date" |
|
|
|
|
|
|
|
|
+ " ROW_NUMBER() OVER (ORDER BY parsed_date, income, expenditure) AS id," |
|
|
|
|
|
+ " formatted_date AS date," |
|
|
|
|
|
+ " COALESCE(ROUND(income, 2), 0) AS income," |
|
|
|
|
|
+ " COALESCE(ROUND(expenditure, 2), 0) AS expenditure," |
|
|
|
|
|
+ " ROUND(SUM(COALESCE(income, 0) - COALESCE(expenditure, 0)) OVER (ORDER BY parsed_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 2) AS balance," |
|
|
|
|
|
+ " CASE" |
|
|
|
|
|
+ " WHEN income > 0 THEN paymentMilestone" |
|
|
|
|
|
+ " ELSE 'Monthly Manpower Expenditure'" |
|
|
|
|
|
+ " END AS remarks" |
|
|
|
|
|
+ " FROM (" |
|
|
|
|
|
+ " SELECT" |
|
|
|
|
|
+ " DATE_FORMAT(i.receiptDate, '%Y-%m') AS parsed_date," |
|
|
|
|
|
+ " DATE_FORMAT(i.receiptDate, '%m/%y') AS formatted_date," |
|
|
|
|
|
+ " SUM(i.paidAmount) AS income," |
|
|
|
|
|
+ " NULL AS expenditure," |
|
|
|
|
|
+ " i.paymentMilestone AS paymentMilestone" |
|
|
|
|
|
+ " FROM" |
|
|
|
|
|
+ " project p" |
|
|
|
|
|
+ " LEFT JOIN invoice i ON p.code = i.projectCode" |
|
|
|
|
|
+ " WHERE" |
|
|
|
|
|
+ " p.id IN (:projectIds)" |
|
|
|
|
|
+ " AND i.paidAmount IS NOT NULL" |
|
|
|
|
|
+ " GROUP BY" |
|
|
|
|
|
+ " parsed_date," |
|
|
|
|
|
+ " formatted_date," |
|
|
|
|
|
+ " i.paymentMilestone" |
|
|
|
|
|
+ " UNION" |
|
|
|
|
|
+ " SELECT" |
|
|
|
|
|
+ " DATE_FORMAT(r.date, '%Y-%m') AS parsed_date," |
|
|
|
|
|
+ " DATE_FORMAT(r.date, '%m/%y') AS formatted_date," |
|
|
|
|
|
+ " NULL AS income," |
|
|
|
|
|
+ " SUM(r.expenditure) AS expenditure," |
|
|
|
|
|
+ " NULL AS paymentMilestone" |
|
|
|
|
|
+ " FROM (" |
|
|
|
|
|
+ " SELECT" |
|
|
|
|
|
+ " t.recordDate AS date," |
|
|
|
|
|
+ " (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 IN (:projectIds)" |
|
|
|
|
|
+ " GROUP BY" |
|
|
|
|
|
+ " s2.hourlyRate," |
|
|
|
|
|
+ " t.recordDate" |
|
|
|
|
|
+ " ) AS r" |
|
|
|
|
|
+ " GROUP BY" |
|
|
|
|
|
+ " parsed_date," |
|
|
|
|
|
+ " formatted_date" |
|
|
|
|
|
+ " ) AS combined_data" |
|
|
|
|
|
+ " ORDER BY" |
|
|
|
|
|
+ " parsed_date;" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|
return jdbcDao.queryForList(sql.toString(), args) |
|
|