From c72d35620658f05d12e6d7ddda6959ffd8930689 Mon Sep 17 00:00:00 2001 From: AJITHKUMAR12 <48044092+AJITHKUMAR12@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:31:45 +0530 Subject: [PATCH] Implemented coworkspace new requirement report page --- .../configuration/DataSourceConfig.java | 21 +- .../controller/CoworkspaceApicontroller.java | 73 ++ .../controller/MainController.java | 16 +- .../service/CoworkspaceService.java | 461 +++++++ .../templates/modules/coworkspace.html | 1112 +++++++++++++++++ .../templates/modules/coworkspacereport.html | 695 +++++++++++ 6 files changed, 2371 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gcc/commissionerreview/controller/CoworkspaceApicontroller.java create mode 100644 src/main/java/com/gcc/commissionerreview/service/CoworkspaceService.java create mode 100644 src/main/resources/templates/modules/coworkspace.html create mode 100644 src/main/resources/templates/modules/coworkspacereport.html diff --git a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java index fd59e62..d78b46d 100644 --- a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java +++ b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java @@ -17,11 +17,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement public class DataSourceConfig { -// private static String host = "localhost:3306"; -// private static String dbpassword = "root"; + // private static String host = "localhost:3306"; + // private static String dbpassword = "root"; - private static String host ="gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306"; - private static String dbpassword = "gcc-facial-password"; + private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306"; + private static String dbpassword = "gcc-facial-password"; public static class MyDataSourceConfig { @Primary @@ -222,7 +222,7 @@ public class DataSourceConfig { dataSource.setPassword(dbpassword); return dataSource; } - + ////////// RoadWar Web ////////////////////// @Bean(name = "mysqlRoadWarWebDataSource") public DataSource mysqlRoadWarWebDataSource() { @@ -234,6 +234,17 @@ public class DataSourceConfig { return dataSource; } + @Bean(name = "mysqlcowrspaceDataSource") + public DataSource mysqlCoworkspacebDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://" + host + "/coworkingspace"); + + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + ////////// News Feed////////////////////// @Bean(name = "mysqlNewsFeedDataSource") public DataSource mysqlNewsFeedDataSource() { diff --git a/src/main/java/com/gcc/commissionerreview/controller/CoworkspaceApicontroller.java b/src/main/java/com/gcc/commissionerreview/controller/CoworkspaceApicontroller.java new file mode 100644 index 0000000..27c7997 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/CoworkspaceApicontroller.java @@ -0,0 +1,73 @@ +package com.gcc.commissionerreview.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.gcc.commissionerreview.service.CommunityHallService; +import com.gcc.commissionerreview.service.CoworkspaceService; + +@RestController +@RequestMapping("/commissionerreview/api/coworkspace") +public class CoworkspaceApicontroller { + + @Autowired + private CoworkspaceService reportService; + + // ak + @GetMapping("/performance-report") + public ResponseEntity>> getPerformanceReport( + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + reportService.getPerformanceReport(fromDate, toDate)); + } + + @GetMapping("/building-bookings") + public ResponseEntity>> getBuildingBookings( + @RequestParam Integer bid, + @RequestParam Integer cid, + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate, + @RequestParam(required = false) String filterBy) { + + return ResponseEntity.ok( + reportService.getBuildingBookings(bid, cid, fromDate, toDate, filterBy)); + } + + @GetMapping("/category-summary") + public ResponseEntity>> getCategorySummary( + @RequestParam Integer bid, + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + reportService.getCategorySummary( + bid, fromDate, toDate)); + } + + @GetMapping("/dashboard") + public ResponseEntity> getDashboard() { + return ResponseEntity.ok(reportService.getDashboard()); + } + + @GetMapping("/getReport") + public ResponseEntity>> getReport( + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate, + @RequestParam(required = false) String filterBy) { + + return ResponseEntity.ok( + reportService.getReport(fromDate, toDate, filterBy)); + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/controller/MainController.java b/src/main/java/com/gcc/commissionerreview/controller/MainController.java index 1aa2916..e5d0d96 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/MainController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/MainController.java @@ -350,10 +350,22 @@ public class MainController { public String communityhallcaretaker(Model model) { return "modules/communitycaretaker"; } - + @GetMapping("/roadwarweb/misreport") public String roadWarWebReport(Model model) { return "modules/roadwarweb/misreport"; } - + + /* + * @GetMapping("/coworkspacereport") + * public String coworkspacereport(Model model) { + * return "modules/coworkspacereport"; + * } + */ + + @GetMapping("/coworkspacedetailedreport") + public String coworkspacedetailedreport(Model model) { + return "modules/coworkspace"; + } + } diff --git a/src/main/java/com/gcc/commissionerreview/service/CoworkspaceService.java b/src/main/java/com/gcc/commissionerreview/service/CoworkspaceService.java new file mode 100644 index 0000000..a734f7d --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/CoworkspaceService.java @@ -0,0 +1,461 @@ +package com.gcc.commissionerreview.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class CoworkspaceService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setFeedbackDataSource(@Qualifier("mysqlcowrspaceDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public List> getPerformanceReport(String fromDate, String toDate) { + + StringBuilder sql = new StringBuilder(); + + sql.append(""" + SELECT + b.bid, + b.name AS building_name, + + COUNT(bk.booking_id) AS total_bookings, + + IFNULL(SUM(bk.amount),0) AS total_revenue, + + SUM( + CASE + WHEN CURDATE() BETWEEN bk.from_date AND bk.to_date + THEN 1 ELSE 0 + END + ) AS ongoing_bookings, + + SUM( + CASE + WHEN bk.to_date < CURDATE() + THEN 1 ELSE 0 + END + ) AS completed_bookings, + + SUM( + CASE + WHEN bk.from_date > CURDATE() + THEN 1 ELSE 0 + END + ) AS future_bookings + + FROM booking bk + LEFT JOIN buildings b + ON bk.bid = b.bid + + WHERE 1=1 + """); + + List params = new ArrayList<>(); + + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + sql.append(" AND bk.from_date BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append(""" + GROUP BY b.bid, b.name + ORDER BY b.bid + """); + + return jdbcTemplate.queryForList(sql.toString(), params.toArray()); + } + + public List> getBuildingBookings( + Integer bid, + Integer cid, + String fromDate, + String toDate, + String filterBy) { + + StringBuilder sql = new StringBuilder(); + + sql.append(""" + SELECT + bk.booking_id, + bk.user_name, + bk.mobile, + bk.from_date, + bk.to_date, + bk.no_of_person, + bk.amount, + bk.cdate AS booking_date + FROM booking bk + WHERE bk.bid = ? + AND bk.cid = ? + AND bk.booking_status = 'success' + """); + + List params = new ArrayList<>(); + params.add(bid); + params.add(cid); + + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + if ("slot_date".equals(filterBy)) { + + sql.append(""" + AND EXISTS ( + SELECT 1 + FROM calendar cl + WHERE cl.bookingid = bk.booking_id + AND DATE(cl.bdate) BETWEEN ? AND ? + ) + """); + + params.add(fromDate); + params.add(toDate); + + } else if ("current_date".equals(filterBy)) { + + sql.append(""" + AND DATE(bk.cdate) BETWEEN ? AND ? + """); + + params.add(fromDate); + params.add(toDate); + + } else { + + sql.append(""" + AND bk.from_date BETWEEN ? AND ? + """); + + params.add(fromDate); + params.add(toDate); + } + } + + sql.append(""" + ORDER BY bk.cdate + """); + + return jdbcTemplate.queryForList(sql.toString(), params.toArray()); + } + + public List> getBuildingBookingswithoutfilterby(Integer bid, Integer cid, + String fromDate, + String toDate) { + + StringBuilder sql = new StringBuilder(); + + sql.append(""" + SELECT + booking_id, + user_name, + mobile, + from_date, + to_date, + no_of_person, + amount, + cdate AS booking_date + FROM booking + WHERE bid = ? AND cid = ? + """); + + List params = new ArrayList<>(); + params.add(bid); + params.add(cid); + + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + sql.append(" AND from_date BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append(" ORDER BY cdate "); + + return jdbcTemplate.queryForList(sql.toString(), params.toArray()); + } + + public List> getCategorySummary(Integer bid, + String fromDate, + String toDate) { + + StringBuilder sql = new StringBuilder(); + + sql.append(""" + SELECT + c.cid, + c.bid, + c.display_name AS category_name, + + COUNT(bk.booking_id) AS total_bookings, + + IFNULL(SUM(bk.amount),0) AS total_revenue, + + SUM( + CASE + WHEN CURDATE() BETWEEN bk.from_date AND bk.to_date + THEN 1 + ELSE 0 + END + ) AS ongoing_bookings, + + SUM( + CASE + WHEN bk.to_date < CURDATE() + THEN 1 + ELSE 0 + END + ) AS completed_bookings, + + SUM( + CASE + WHEN bk.from_date > CURDATE() + THEN 1 + ELSE 0 + END + ) AS future_bookings + + FROM category c + + LEFT JOIN booking bk + ON c.cid = bk.cid + AND c.bid = bk.bid + + WHERE c.bid = ? + """); + + List params = new ArrayList<>(); + params.add(bid); + + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + sql.append(" AND bk.from_date BETWEEN ? AND ? "); + + params.add(fromDate); + params.add(toDate); + } + + sql.append(""" + GROUP BY c.cid,c.name + ORDER BY c.name + """); + + return jdbcTemplate.queryForList(sql.toString(), params.toArray()); + } + + public Map getDashboard() { + + Map dashboard = new HashMap<>(); + + // Card 1 + Integer totalBuildings = jdbcTemplate.queryForObject( + "SELECT COUNT(bid) FROM buildings where isactive = 1 and isdelete = 0", + Integer.class); + + // Card 2 + Integer totalBookings = jdbcTemplate.queryForObject( + "SELECT COUNT(booking_id) FROM booking ", + Integer.class); + + // Card 3 + Double totalRevenue = jdbcTemplate.queryForObject( + "SELECT IFNULL(SUM(amount),0) FROM booking", + Double.class); + + // Card 4 + List> categories = jdbcTemplate.queryForList(""" + SELECT + display_name, + COUNT(display_name) AS total + FROM category + GROUP BY display_name + ORDER BY display_name + """); + + // Card 5 + List> slotDetails = jdbcTemplate.queryForList(""" + SELECT DISTINCT + s.display_name AS subcategory_name, + c.display_name AS category_name, + sl.name AS slot_name + FROM category c + LEFT JOIN subcategory s + ON c.cid = s.cid + LEFT JOIN slots sl + ON s.scid = sl.scid + ORDER BY + c.display_name, + s.display_name, + sl.name + """); + + dashboard.put("totalBuildings", totalBuildings); + dashboard.put("totalBookings", totalBookings); + dashboard.put("totalRevenue", totalRevenue); + + dashboard.put("categories", categories); + + dashboard.put("slotCount", slotDetails.size()); + dashboard.put("slotDetails", slotDetails); + + return dashboard; + } + + // new requirement + public List> getReport(String fromDate, String toDate, String filterBy) { + + StringBuilder sql = new StringBuilder(); + + sql.append(""" + SELECT + b.bid, + + + b.name AS building_name, + b.inauguration_date, + DATEDIFF(CURDATE(), DATE(b.inauguration_date)) AS operational_days, + + COUNT(bk.booking_id) AS total_bookings, + + + IFNULL(SUM(bk.amount), 0) AS total_revenue, + + IFNULL(cs.total_slot, 0) AS total_slot, + + COUNT(CASE + WHEN cat.display_name = 'Desk Space' + THEN bk.booking_id + END) AS desk_space, + + COUNT(CASE + WHEN cat.display_name = 'Learning Centre' + THEN bk.booking_id + END) AS learning_centre, + + COUNT(CASE + WHEN cat.display_name = 'Meeting Rooms' + THEN bk.booking_id + END) AS meeting_rooms, + MAX(CASE + WHEN cat.display_name = 'Desk Space' + THEN cat.cid + END) AS desk_space_cid, + + MAX(CASE + WHEN cat.display_name = 'Learning Centre' + THEN cat.cid + END) AS learning_centre_cid, + + MAX(CASE + WHEN cat.display_name = 'Meeting Rooms' + THEN cat.cid + END) AS meeting_rooms_cid + + FROM buildings b + + LEFT JOIN booking bk + ON b.bid = bk.bid + + LEFT JOIN category cat + ON bk.cid = cat.cid + AND bk.bid = cat.bid + + LEFT JOIN ( + SELECT + c.bid, + COUNT(c.bookingid) AS total_slot + FROM calendar c + LEFT JOIN booking b + ON c.bookingid = b.booking_id + GROUP BY c.bid + + ) cs + ON b.bid = cs.bid + + + """); + sql.append(" WHERE 1=1 AND bk.booking_status = 'success' "); + + List params = new ArrayList<>(); + + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + if ("slot_date".equals(filterBy)) { + + sql.append(""" + AND EXISTS ( + SELECT 1 + FROM calendar cl + WHERE cl.bookingid = bk.booking_id + AND DATE(cl.bdate) BETWEEN ? AND ? + ) + """); + + params.add(fromDate); + params.add(toDate); + + } else if ("current_date".equals(filterBy)) { + + sql.append(""" + AND DATE(bk.cdate) BETWEEN ? AND ? + """); + + params.add(fromDate); + params.add(toDate); + + } else { + + sql.append(""" + AND bk.from_date BETWEEN ? AND ? + """); + + params.add(fromDate); + params.add(toDate); + } + } + /* + * List params = new ArrayList<>(); + * if (fromDate != null && !fromDate.isBlank() + * && toDate != null && !toDate.isBlank()) { + * + * sql.append(" AND bk.from_date BETWEEN ? AND ? "); + * params.add(fromDate); + * params.add(toDate); + * } + */ + + sql.append(""" + GROUP BY + b.bid, + b.name, + b.inauguration_date, + cs.total_slot + + ORDER BY + b.bid + """); + + return jdbcTemplate.queryForList(sql.toString(), params.toArray()); + } + +} diff --git a/src/main/resources/templates/modules/coworkspace.html b/src/main/resources/templates/modules/coworkspace.html new file mode 100644 index 0000000..b30293d --- /dev/null +++ b/src/main/resources/templates/modules/coworkspace.html @@ -0,0 +1,1112 @@ + + + + + Muthalvarpadaippagam Performance Report + + + + + + + + + + + + + + + + +
+
+

Muthalvarpadaippagam Performance Report

+
+
+
+
+
+
Total No of Muthalvarpadaippagam
+

0

+
+
+
+ +
+
+
+
Total Bookings
+

0

+
+
+
+ +
+
+
+
Total Revenue
+

0

+
+
+
+ + + +
+
+
+ Categories + Locations +
+ +
+
+
+
+ +
+ +
+ + + + + +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+ +
+ + + + + +
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
S.NoMuthalvarpadaippagam NameInauguration DateOperational DaysTotal BookingTotal ReveneueTotal Slot BookedDesk Space BookingsLearning Center BookingsMeeting Room Bookings
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modules/coworkspacereport.html b/src/main/resources/templates/modules/coworkspacereport.html new file mode 100644 index 0000000..ac8e06f --- /dev/null +++ b/src/main/resources/templates/modules/coworkspacereport.html @@ -0,0 +1,695 @@ + + + + + Coworkspace Performance Report + + + + + + + + + + + + + + + + +
+
+

Coworkspace Performance Report

+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + + + +
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + +
S.NoBuilding NameTotal BookingsTotal RevenueOngoingCompletedFuture
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file