| @@ -1813,75 +1813,86 @@ open class DashboardService( | |||||
| // + " ) AS combined_data" | // + " ) AS combined_data" | ||||
| // + " ORDER BY" | // + " ORDER BY" | ||||
| // + " parsed_date;" | // + " parsed_date;" | ||||
| " select" | |||||
| + " 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 concat('Invoice Receipt: ',invoiceNo)" | |||||
| + " 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.invoiceNo AS invoiceNo" | |||||
| + " FROM" | |||||
| + " project p" | |||||
| + " LEFT JOIN invoice i ON p.code = i.projectCode and i.deleted = 0" //update invoice deletable | |||||
| + " WHERE" | |||||
| + " p.id IN (:projectIds)" | |||||
| + " AND i.paidAmount IS NOT NULL" | |||||
| + " GROUP BY" | |||||
| + " parsed_date," | |||||
| + " formatted_date," | |||||
| + " i.invoiceNo" | |||||
| + " 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" | |||||
| + " se.timesheet_record_date AS date," | |||||
| + " (COALESCE(SUM(t3.normalConsumed), 0) * se.hourlyRate) + (COALESCE(SUM(t3.otConsumed), 0) * se.hourlyRate * 1.0) AS expenditure" | |||||
| + " from (" | |||||
| + " select" | |||||
| + " t2.id as tid," | |||||
| + " t2.recordDate as timesheet_record_date," | |||||
| + " s.id as staff_id," | |||||
| + " se.id as salary_effective_id," | |||||
| + " se.salaryId," | |||||
| + " se.startdate as salary_effective_start_date," | |||||
| + " coalesce(se.enddate,NOW()) as salary_effective_end_date," | |||||
| + " s2.hourlyRate as hourlyRate" | |||||
| + " from project p2" | |||||
| + " left join project_task pt ON p2.id = pt.project_id" | |||||
| + " left join timesheet t2 on pt.id = t2.projectTaskId" | |||||
| + " left join staff s on t2.staffId = s.id" | |||||
| + " left join salary_effective se on t2.recordDate >= se.`date` and s.id = se.staffId" | |||||
| + " left join salary s2 on se.salaryId = s2.salaryPoint" | |||||
| + " where p2.status = 'On-going'" | |||||
| + " and t2.id is not null" | |||||
| + " AND p2.id IN (:projectIds)" | |||||
| + " group by t2.id, s.id, se.id, se.salaryId,se.date, s2.hourlyRate" | |||||
| + " ) as se" | |||||
| + " left join timesheet t3 on se.tid = t3.id" | |||||
| + " where t3.recordDate >= se.salary_effective_start_date and t3.recordDate <= se.salary_effective_end_date" | |||||
| + " group by se.timesheet_record_date, se.hourlyRate" | |||||
| + " ) AS r" | |||||
| + " GROUP BY" | |||||
| + " parsed_date," | |||||
| + " formatted_date" | |||||
| + " ) AS combined_data" | |||||
| + " ORDER BY" | |||||
| + " parsed_date" | |||||
| "select" | |||||
| + " ROW_NUMBER() OVER (ORDER BY parsed_date, income, expenditure, expense) AS id, " | |||||
| + " formatted_date AS date, " | |||||
| + " COALESCE(ROUND(income, 2), 0) AS income, " | |||||
| + " COALESCE(ROUND(expenditure, 2), 0) AS expenditure, " | |||||
| + " COALESCE(ROUND(expense, 2), 0) as expense, " | |||||
| + " ROUND(SUM(COALESCE(income, 0) - COALESCE(expenditure, 0) - COALESCE(expense, 0)) OVER (ORDER BY parsed_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 2) AS balance, " | |||||
| + " CASE " | |||||
| + " WHEN income > 0 THEN concat('Invoice Receipt: ',invoiceNo) " | |||||
| + " when expense > 0 THEN concat('Project Expense: ',invoiceNo) " | |||||
| + " ELSE 'Monthly Manpower Expenditure' " | |||||
| + " END AS remarks " | |||||
| + " FROM ( " | |||||
| + " SELECT " | |||||
| + " DATE_FORMAT(pe.receiptDate, '%Y-%m') AS parsed_date, " | |||||
| + " DATE_FORMAT(pe.receiptDate, '%m/%y') AS formatted_date, " | |||||
| + " NULL AS income, " | |||||
| + " NULL AS expenditure, " | |||||
| + " SUM(pe.amount) AS expense, " | |||||
| + " COALESCE(CAST(pe.expenseNo AS CHAR), 'no expenseNo') AS invoiceNo " | |||||
| + " FROM project_expense pe " | |||||
| + " WHERE pe.projectId IN (:projectIds) " | |||||
| + " AND pe.deleted = false " | |||||
| + " GROUP BY parsed_date, formatted_date, pe.expenseNo " | |||||
| + " UNION " | |||||
| + " 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, " | |||||
| + " null AS expense, " | |||||
| + " COALESCE(CAST(i.invoiceNo AS CHAR), 'No Invoice') AS invoiceNo " | |||||
| + " FROM project p " | |||||
| + " LEFT JOIN invoice i ON p.code = i.projectCode AND i.deleted = 0 " | |||||
| + " WHERE p.id IN (:projectIds) " | |||||
| + " AND i.paidAmount IS NOT NULL " | |||||
| + " GROUP BY parsed_date, formatted_date, i.invoiceNo " | |||||
| + " 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 expense " | |||||
| + " , NULL AS invoiceNo " | |||||
| + " FROM ( " | |||||
| + " SELECT " | |||||
| + " se.timesheet_record_date AS date, " | |||||
| + " (COALESCE(SUM(t3.normalConsumed), 0) * se.hourlyRate) + (COALESCE(SUM(t3.otConsumed), 0) * se.hourlyRate * 1.0) AS expenditure " | |||||
| + " from ( " | |||||
| + " select " | |||||
| + " t2.id as tid, " | |||||
| + " t2.recordDate as timesheet_record_date, " | |||||
| + " s.id as staff_id, " | |||||
| + " se.id as salary_effective_id, " | |||||
| + " se.salaryId, " | |||||
| + " se.startdate as salary_effective_start_date, " | |||||
| + " coalesce(se.enddate,NOW()) as salary_effective_end_date, " | |||||
| + " s2.hourlyRate as hourlyRate " | |||||
| + " from project p2 " | |||||
| + " left join project_task pt ON p2.id = pt.project_id " | |||||
| + " left join timesheet t2 on pt.id = t2.projectTaskId " | |||||
| + " left join staff s on t2.staffId = s.id " | |||||
| + " left join salary_effective se on t2.recordDate >= se.`date` and s.id = se.staffId " | |||||
| + " left join salary s2 on se.salaryId = s2.salaryPoint " | |||||
| + " where p2.status = 'On-going' " | |||||
| + " and t2.id is not null " | |||||
| + " AND p2.id IN (:projectIds) " | |||||
| + " group by t2.id, s.id, se.id, se.salaryId,se.date, s2.hourlyRate " | |||||
| + " ) as se " | |||||
| + " left join timesheet t3 on se.tid = t3.id " | |||||
| + " where t3.recordDate >= se.salary_effective_start_date and t3.recordDate <= se.salary_effective_end_date " | |||||
| + " group by se.timesheet_record_date, se.hourlyRate " | |||||
| + " ) 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) | ||||
| @@ -1986,81 +1997,101 @@ open class DashboardService( | |||||
| // + " left join staff s on t.staffId = s.id" | // + " left join staff s on t.staffId = s.id" | ||||
| // + " left join salary s2 on s.salaryId = s2.salaryPoint" | // + " left join salary s2 on s.salaryId = s2.salaryPoint" | ||||
| // + " where t.id is not null" | // + " where t.id is not null" | ||||
| " select" | |||||
| + " months.month as monthExpenditure," | |||||
| + " coalesce (expenditure.recordMonth,'-') as recordMonth," | |||||
| + " coalesce (expenditure.expenditure,0) as expenditure," | |||||
| + " SUM(COALESCE(expenditure.expenditure, 0)) OVER (ORDER BY months.month) AS cumulativeExpenditure" | |||||
| + " FROM (" | |||||
| + " SELECT 01 AS month" | |||||
| + " UNION" | |||||
| + " SELECT 02" | |||||
| + " UNION" | |||||
| + " SELECT 03" | |||||
| + " UNION" | |||||
| + " SELECT 04" | |||||
| + " UNION" | |||||
| + " SELECT 05" | |||||
| + " UNION" | |||||
| + " SELECT 06" | |||||
| + " UNION" | |||||
| + " SELECT 07" | |||||
| + " UNION" | |||||
| + " SELECT 08" | |||||
| + " UNION" | |||||
| + " SELECT 09" | |||||
| + " UNION" | |||||
| + " SELECT 10" | |||||
| + " UNION" | |||||
| + " SELECT 11" | |||||
| + " union" | |||||
| + " select 12" | |||||
| + " ) AS months" | |||||
| + " left join(" | |||||
| + " SELECT" | |||||
| + " r.recordMonth as recordMonth," | |||||
| + " sum(r.cumulativeExpenditure) as expenditure" | |||||
| + " from(" | |||||
| + " select" | |||||
| + " se.recordMonth," | |||||
| + " t3.id," | |||||
| + " coalesce(sum(t3.normalConsumed),0) as normalConsumed," | |||||
| + " coalesce(sum(t3.otConsumed),0) as otConsumed," | |||||
| + " se.hourlyRate as hourlyRate," | |||||
| + " (coalesce(sum(t3.normalConsumed),0) * se.hourlyRate) + (coalesce(sum(t3.otConsumed),0) * se.hourlyRate * 1.0) as cumulativeExpenditure" | |||||
| + " from (" | |||||
| + " select" | |||||
| + " month(t2.recordDate) as recordMonth," | |||||
| + " t2.id as tid," | |||||
| + " t2.recordDate as timesheet_record_date," | |||||
| + " s.id as staff_id," | |||||
| + " se.id as salary_effective_id," | |||||
| + " se.salaryId," | |||||
| + " se.startdate as salary_effective_start_date," | |||||
| + " coalesce(se.enddate,now()) as salary_effective_end_date," | |||||
| + " s2.hourlyRate as hourlyRate" | |||||
| + " from project p" | |||||
| + " left join team t on p.teamLead = t.teamLead" | |||||
| + " left join project_task pt on p.id = pt.project_id" | |||||
| + " left join timesheet t2 on pt.id = t2.projectTaskId" | |||||
| + " left join staff s on t2.staffId = s.id" | |||||
| + " left join salary_effective se on t2.recordDate >= se.`date` and s.id = se.staffId" | |||||
| + " left join salary s2 on se.salaryId = s2.salaryPoint" | |||||
| + " where t.id is not null" | |||||
| ) | |||||
| "with e_cte as (" | |||||
| + " select" | |||||
| + " pe.projectId," | |||||
| + " month(pe.receiptDate) as recordMonth," | |||||
| + " sum(pe.amount) as expense" | |||||
| + " from project_expense pe" | |||||
| + " where pe.deleted = false" | |||||
| + " and year(pe.receiptDate) = :year" | |||||
| + " group by month(pe.receiptDate), pe.projectId" | |||||
| + " )" | |||||
| + " select" | |||||
| + " months.month as monthExpenditure," | |||||
| + " coalesce (expenditure.recordMonth,'-') as recordMonth," | |||||
| + " coalesce (expenditure.expenditure,0) as expenditure," | |||||
| + " SUM(COALESCE(expenditure.expenditure, 0)) OVER (ORDER BY months.month) AS cumulativeExpenditure" | |||||
| + " FROM (" | |||||
| + " SELECT 01 AS month" | |||||
| + " UNION" | |||||
| + " SELECT 02" | |||||
| + " UNION" | |||||
| + " SELECT 03" | |||||
| + " UNION" | |||||
| + " SELECT 04" | |||||
| + " UNION" | |||||
| + " SELECT 05" | |||||
| + " UNION" | |||||
| + " SELECT 06" | |||||
| + " UNION" | |||||
| + " SELECT 07" | |||||
| + " UNION" | |||||
| + " SELECT 08" | |||||
| + " UNION" | |||||
| + " SELECT 09" | |||||
| + " UNION" | |||||
| + " SELECT 10" | |||||
| + " UNION" | |||||
| + " SELECT 11" | |||||
| + " union" | |||||
| + " select 12" | |||||
| + " ) AS months" | |||||
| + " left join(" | |||||
| + " select" | |||||
| + " anotherResult.recordMonth," | |||||
| + " anotherResult.expenditure + coalesce(ec.expense, 0) as expenditure," | |||||
| + " coalesce(ec.expense, 0) as expense" | |||||
| + " from (" | |||||
| + " select" | |||||
| + " group_concat(r.projectId) as projectId," | |||||
| + " r.recordMonth as recordMonth," | |||||
| + " sum(r.cumulativeExpenditure) as expenditure" | |||||
| + " from(" | |||||
| + " select" | |||||
| + " se.projectId," | |||||
| + " se.recordMonth," | |||||
| + " t3.id," | |||||
| + " coalesce(sum(t3.normalConsumed),0) as normalConsumed," | |||||
| + " coalesce(sum(t3.otConsumed),0) as otConsumed," | |||||
| + " se.hourlyRate as hourlyRate," | |||||
| + " (coalesce(sum(t3.normalConsumed),0) * se.hourlyRate) + (coalesce(sum(t3.otConsumed),0) * se.hourlyRate * 1.0) as cumulativeExpenditure" | |||||
| + " from (" | |||||
| + " select" | |||||
| + " p.id as projectId," | |||||
| + " month(t2.recordDate) as recordMonth," | |||||
| + " t2.id as tid," | |||||
| + " t2.recordDate as timesheet_record_date," | |||||
| + " s.id as staff_id," | |||||
| + " se.id as salary_effective_id," | |||||
| + " se.salaryId," | |||||
| + " se.startdate as salary_effective_start_date," | |||||
| + " coalesce(se.enddate,now()) as salary_effective_end_date," | |||||
| + " s2.hourlyRate as hourlyRate" | |||||
| + " from project p" | |||||
| + " left join team t on p.teamLead = t.teamLead" | |||||
| + " left join project_task pt on p.id = pt.project_id" | |||||
| + " left join timesheet t2 on pt.id = t2.projectTaskId" | |||||
| + " left join staff s on t2.staffId = s.id" | |||||
| + " left join salary_effective se on t2.recordDate >= se.`date` and s.id = se.staffId" | |||||
| + " left join salary s2 on se.salaryId = s2.salaryPoint" | |||||
| + " where t.id is not null" | |||||
| ) | |||||
| 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") | ||||
| } | } | ||||
| sql.append(" and year(t2.recordDate) = :year" | |||||
| + " group by month(t2.recordDate),t2.id, s.id, se.id, se.salaryId,se.date, s2.hourlyRate" | |||||
| + " ) as se" | |||||
| + " left join timesheet t3 on se.tid = t3.id" | |||||
| + " where t3.recordDate >= se.salary_effective_start_date and t3.recordDate <= se.salary_effective_end_date" | |||||
| + " group by se.recordMonth, t3.id, se.hourlyRate" | |||||
| + " ) as r" | |||||
| + " group by r.recordMonth" | |||||
| + " ) as expenditure on months.month = expenditure.recordMonth" | |||||
| sql.append(" and year(t2.recordDate) = :year " | |||||
| + " group by month(t2.recordDate),t2.id, s.id, se.id, se.salaryId,se.date, s2.hourlyRate " | |||||
| + " ) as se " | |||||
| + " left join timesheet t3 on se.tid = t3.id " | |||||
| + " where t3.recordDate >= se.salary_effective_start_date and t3.recordDate <= se.salary_effective_end_date " | |||||
| + " group by se.recordMonth, t3.id, se.hourlyRate " | |||||
| + " ) as r " | |||||
| + " group by r.recordMonth " | |||||
| + " ) as anotherResult " | |||||
| + " left join e_cte ec on FIND_IN_SET(ec.projectId, anotherResult.projectId) > 0 and ec.recordMonth = anotherResult.recordMonth " | |||||
| + " ) as expenditure on months.month = expenditure.recordMonth " | |||||
| ) | ) | ||||
| return jdbcDao.queryForList(sql.toString(), args) | return jdbcDao.queryForList(sql.toString(), args) | ||||