diff --git a/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController.java b/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController.java index af83d166..47d33f8b 100644 --- a/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController.java +++ b/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController.java @@ -16,45 +16,45 @@ import in.gov.chennaicorporation.mobileservice.works.service.WorksService; @RequestMapping("/gccofficialapp/works/api") @RestController("worksRestapi") public class WorksController { - + @Autowired private WorksService worksService; - + /* + * @GetMapping("/getESTList") + * public List getTaskList( + * + * @RequestParam(value = "typeofworkid", required = true) String typeofworkid + * ) { + * return worksService.getTaskList(typeofworkid); + * } + */ + @GetMapping("/getESTList") - public List getTaskList( - @RequestParam(value = "typeofworkid", required = true) String typeofworkid - ) { - return worksService.getTaskList(typeofworkid); - } - */ - - @GetMapping("/getESTList") - public List getESTList( - @RequestParam(value = "typeofworkid", required = false) String typeofworkid, - @RequestParam(value = "loginId", required = true) String loginId - ) { - return worksService.getESTList(loginId); - } - + public List getESTList( + @RequestParam(value = "typeofworkid", required = false) String typeofworkid, + @RequestParam(value = "loginId", required = true) String loginId) { + return worksService.getESTList(loginId); + } + @GetMapping("/getESTWorkListData") - public List getESTWorkListData( - @RequestParam(value = "estid", required = true) String estid, - @RequestParam(value = "loginId", required = false) String cby - ) { - return worksService.getESTWorkListData(estid); - } - + public List getESTWorkListData( + @RequestParam(value = "estid", required = true) String estid, + @RequestParam(value = "loginId", required = false) String cby, + @RequestParam(value = "typeofworkid", required = true) String typeofworkid) { + return worksService.getESTWorkListData(estid, typeofworkid); + } + @GetMapping("/getTaskDataListWithData") - public List getTaskDataListWithData( - @RequestParam(value = "worktasktid", required = true) String wtid, - @RequestParam(value = "estid", required = true) String estid, - @RequestParam(value = "typeofworkid", required = true) String typeofworkid - ) { - return worksService.getTaskDataListWithData(wtid, estid,typeofworkid); - } - - @PostMapping(value="/addTaskStageActivityData") + public List getTaskDataListWithData( + @RequestParam(value = "worktasktid", required = true) String wtid, + @RequestParam(value = "estid", required = true) String estid, + @RequestParam(value = "typeofworkid", required = true) String typeofworkid, + @RequestParam(value = "refId", required = true) String refId) { + return worksService.getTaskDataListWithData(wtid, estid, typeofworkid, refId); + } + + @PostMapping(value = "/addTaskStageActivityData") public List addTaskStageActivityData(@RequestParam MultiValueMap formData, @RequestParam(value = "estid", required = true) String estid, @RequestParam(value = "tmid", required = true) String tmid, @@ -65,34 +65,33 @@ public class WorksController { @RequestParam(value = "loginId", required = true) String cby, @RequestParam(value = "zone", required = true) String zone, @RequestParam(value = "ward", required = true) String ward, - @RequestParam(value = "latitude", required = true) String latitude, - @RequestParam(value = "longitude", required = true) String longitude - ) { - return worksService.addTaskStageActivityData(estid, tmid, wtid, activityfile, percentage, remarks, cby, zone, ward, latitude, longitude, "open"); + @RequestParam(value = "latitude", required = true) String latitude, + @RequestParam(value = "longitude", required = true) String longitude, + @RequestParam(value = "refId", required = true) String refId) { + return worksService.addTaskStageActivityData(estid, tmid, wtid, activityfile, percentage, remarks, cby, + zone, + ward, latitude, longitude, "open", refId); } - + @GetMapping("/getZoneReport") - public List getZoneReport( - @RequestParam(value = "loginId", required = false) String cby - ) { - return worksService.getZoneReport(); - } - + public List getZoneReport( + @RequestParam(value = "loginId", required = false) String cby) { + return worksService.getZoneReport(); + } + @GetMapping("/getWardReport") - public List getWardReport( - @RequestParam(value = "zone", required = true) String zone, - @RequestParam(value = "loginId", required = false) String cby - ) { - return worksService.getWardReport(zone); - } - + public List getWardReport( + @RequestParam(value = "zone", required = true) String zone, + @RequestParam(value = "loginId", required = false) String cby) { + return worksService.getWardReport(zone); + } + @GetMapping("/getListReport") - public List getListReport( - @RequestParam(value = "ward", required = true) String ward, - @RequestParam(value = "statusFilter", required = true) String statusFilter, - @RequestParam(value = "loginId", required = false) String cby - ) { - return worksService.getListReport(ward, statusFilter); - } - + public List getListReport( + @RequestParam(value = "ward", required = true) String ward, + @RequestParam(value = "statusFilter", required = true) String statusFilter, + @RequestParam(value = "loginId", required = false) String cby) { + return worksService.getListReport(ward, statusFilter); + } + } diff --git a/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController1.java b/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController1.java new file mode 100644 index 00000000..dad6341a --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/mobileservice/works/controller/WorksController1.java @@ -0,0 +1,93 @@ +package in.gov.chennaicorporation.mobileservice.works.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.works.service.WorksService1; + +@RequestMapping("/gccofficialapp/works/test/api") +@RestController("worksTestRestapi") +public class WorksController1 { + + @Autowired + private WorksService1 worksService1; + + /* + * @GetMapping("/getESTList") + * public List getTaskList( + * + * @RequestParam(value = "typeofworkid", required = true) String typeofworkid + * ) { + * return worksService.getTaskList(typeofworkid); + * } + */ + + @GetMapping("/getESTList") + public List getESTList( + @RequestParam(value = "typeofworkid", required = false) String typeofworkid, + @RequestParam(value = "loginId", required = true) String loginId) { + return worksService1.getESTList(loginId); + } + + @GetMapping("/getESTWorkListData") + public List getESTWorkListData( + @RequestParam(value = "estid", required = true) String estid, + @RequestParam(value = "loginId", required = false) String cby) { + return worksService1.getESTWorkListData(estid); + } + + @GetMapping("/getTaskDataListWithData") + public List getTaskDataListWithData( + @RequestParam(value = "worktasktid", required = true) String wtid, + @RequestParam(value = "estid", required = true) String estid, + @RequestParam(value = "typeofworkid", required = true) String typeofworkid) { + return worksService1.getTaskDataListWithData(wtid, estid, typeofworkid); + } + + @PostMapping(value = "/addTaskStageActivityData") + public List addTaskStageActivityData(@RequestParam MultiValueMap formData, + @RequestParam(value = "estid", required = true) String estid, + @RequestParam(value = "tmid", required = true) String tmid, + @RequestParam(value = "worktasktid", required = true) String wtid, + @RequestParam(value = "activityfile", required = true) MultipartFile activityfile, + @RequestParam(value = "percentage", required = true) String percentage, + @RequestParam(value = "remarks", required = false) String remarks, + @RequestParam(value = "loginId", required = true) String cby, + @RequestParam(value = "zone", required = true) String zone, + @RequestParam(value = "ward", required = true) String ward, + @RequestParam(value = "latitude", required = true) String latitude, + @RequestParam(value = "longitude", required = true) String longitude) { + return worksService1.addTaskStageActivityData(estid, tmid, wtid, activityfile, percentage, remarks, cby, zone, + ward, latitude, longitude, "open"); + } + + @GetMapping("/getZoneReport") + public List getZoneReport( + @RequestParam(value = "loginId", required = false) String cby) { + return worksService1.getZoneReport(); + } + + @GetMapping("/getWardReport") + public List getWardReport( + @RequestParam(value = "zone", required = true) String zone, + @RequestParam(value = "loginId", required = false) String cby) { + return worksService1.getWardReport(zone); + } + + @GetMapping("/getListReport") + public List getListReport( + @RequestParam(value = "ward", required = true) String ward, + @RequestParam(value = "statusFilter", required = true) String statusFilter, + @RequestParam(value = "loginId", required = false) String cby) { + return worksService1.getListReport(ward, statusFilter); + } + +} diff --git a/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService.java b/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService.java index 090fa843..aca49234 100644 --- a/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService.java +++ b/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService.java @@ -43,155 +43,163 @@ import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; @Service public class WorksService { private JdbcTemplate jdbcWorksTemplate; - + private final Environment environment; private String fileBaseUrl; - + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - private static final int STRING_LENGTH = 15; - private static final Random RANDOM = new SecureRandom(); - + private static final int STRING_LENGTH = 15; + private static final Random RANDOM = new SecureRandom(); + @Autowired public void setDataSource(@Qualifier("mysqlWorksDataSource") DataSource worksDataSource) { this.jdbcWorksTemplate = new JdbcTemplate(worksDataSource); } - + @Autowired public WorksService(Environment environment) { this.environment = environment; - this.fileBaseUrl=environment.getProperty("fileBaseUrl"); + this.fileBaseUrl = environment.getProperty("fileBaseUrl"); } - + public static String generateRandomString() { - StringBuilder result = new StringBuilder(STRING_LENGTH); - for (int i = 0; i < STRING_LENGTH; i++) { - result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); - } - return result.toString(); - } - + StringBuilder result = new StringBuilder(STRING_LENGTH); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + public static String generateRandomStringForFile(int String_Lenth) { - StringBuilder result = new StringBuilder(String_Lenth); - for (int i = 0; i < STRING_LENGTH; i++) { - result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); - } - return result.toString(); - } - + StringBuilder result = new StringBuilder(String_Lenth); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + private byte[] compressImage(BufferedImage image, float quality) throws IOException { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); - ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); - writer.setOutput(imageOutputStream); + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(imageOutputStream); - ImageWriteParam param = writer.getDefaultWriteParam(); - if (param.canWriteCompressed()) { - param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - param.setCompressionQuality(quality); - } + ImageWriteParam param = writer.getDefaultWriteParam(); + if (param.canWriteCompressed()) { + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + } + + writer.write(null, new javax.imageio.IIOImage(image, null, null), param); - writer.write(null, new javax.imageio.IIOImage(image, null, null), param); + writer.dispose(); + imageOutputStream.close(); - writer.dispose(); - imageOutputStream.close(); + return byteArrayOutputStream.toByteArray(); + } - return byteArrayOutputStream.toByteArray(); - } - public String fileUpload(String name, String id, MultipartFile file) { - + int lastInsertId = 0; // Set the file path where you want to save it - String uploadDirectory = environment.getProperty("file.upload.directory"); - String serviceFolderName = environment.getProperty("works_task_foldername"); - var year =DateTimeUtil.getCurrentYear(); - var month =DateTimeUtil.getCurrentMonth(); - var date =DateTimeUtil.getCurrentDay(); - - uploadDirectory = uploadDirectory + serviceFolderName + year +"/"+month+"/"+date; - - try { - // Create directory if it doesn't exist - Path directoryPath = Paths.get(uploadDirectory); - if (!Files.exists(directoryPath)) { - Files.createDirectories(directoryPath); - } - - // Datetime string - String datetimetxt = DateTimeUtil.getCurrentDateTime(); - // File name - System.out.println(file.getOriginalFilename()); - String fileName = name+ "_" +id + "_" + datetimetxt + "_" + generateRandomStringForFile(10) + "_" + file.getOriginalFilename(); - fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename - - String filePath = uploadDirectory + "/" + fileName; - - String filepath_txt = "/"+serviceFolderName + year + "/" + month + "/" + date + "/" + fileName; - - // Create a new Path object - Path path = Paths.get(filePath); - - // Get the bytes of the file - byte[] bytes = file.getBytes(); - - // Compress the image - BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); - byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality - - // Write the bytes to the file - Files.write(path, compressedBytes); - - System.out.println(filePath); - return filepath_txt; - - } catch (IOException e) { - e.printStackTrace(); - return "Failed to save file " + file.getOriginalFilename(); - } + String uploadDirectory = environment.getProperty("file.upload.directory"); + String serviceFolderName = environment.getProperty("works_task_foldername"); + var year = DateTimeUtil.getCurrentYear(); + var month = DateTimeUtil.getCurrentMonth(); + var date = DateTimeUtil.getCurrentDay(); + + uploadDirectory = uploadDirectory + serviceFolderName + year + "/" + month + "/" + date; + + try { + // Create directory if it doesn't exist + Path directoryPath = Paths.get(uploadDirectory); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + // Datetime string + String datetimetxt = DateTimeUtil.getCurrentDateTime(); + // File name + System.out.println(file.getOriginalFilename()); + String fileName = name + "_" + id + "_" + datetimetxt + "_" + generateRandomStringForFile(10) + "_" + + file.getOriginalFilename(); + fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename + + String filePath = uploadDirectory + "/" + fileName; + + String filepath_txt = "/" + serviceFolderName + year + "/" + month + "/" + date + "/" + fileName; + + // Create a new Path object + Path path = Paths.get(filePath); + + // Get the bytes of the file + byte[] bytes = file.getBytes(); + + // Compress the image + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality + + // Write the bytes to the file + Files.write(path, compressedBytes); + + System.out.println(filePath); + return filepath_txt; + + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save file " + file.getOriginalFilename(); + } } - + public String getWardByLoginId(String loginid, String type) { - String sqlQuery = "SELECT `ward`, `works` FROM `gcc_penalty_hoardings`.`hoading_user_list` WHERE `userid` = ? LIMIT 1"; - - List> results = jdbcWorksTemplate.queryForList(sqlQuery, loginid); + String sqlQuery = "SELECT `ward`, `works` FROM `gcc_penalty_hoardings`.`hoading_user_list` WHERE `userid` = ? LIMIT 1"; + + List> results = jdbcWorksTemplate.queryForList(sqlQuery, loginid); - if (!results.isEmpty()) { - Map row = results.get(0); - String wardClause; - String departmentClause = ""; + if (!results.isEmpty()) { + Map row = results.get(0); + String wardClause; + String departmentClause = ""; - Object wardValue = row.get("ward"); - Object worksValue = row.get("works"); + Object wardValue = row.get("ward"); + Object worksValue = row.get("works"); - if (wardValue == null || wardValue.toString().equals("0")) { - wardClause = "wu.`ward` NOT IN (0)"; - } else { - wardClause = "wu.`ward` IN ('" + wardValue + "')"; - } + if (wardValue == null || wardValue.toString().equals("0")) { + wardClause = "wu.`ward` NOT IN (0)"; + } else { + wardClause = "wu.`ward` IN ('" + wardValue + "')"; + } - if (worksValue != null) { - departmentClause = " AND wu.`department` IN (" + worksValue + ")"; - } + if (worksValue != null) { + departmentClause = " AND wu.`department` IN (" + worksValue + ")"; + } - return wardClause + departmentClause; - } + return wardClause + departmentClause; + } - return "wu.`ward` IN ('-')"; + return "wu.`ward` IN ('-')"; } - + public List> getESTList(String loginid) { - /* - String sql = "SELECT wu.`Id` AS estid, `wu`.`sub_category` AS works, tw.id AS typeofworkid, `wu`.`estimate_no`, " - + "`wu`.`estimate_date`, `wu`.`zone`, `wu`.`ward`, `wu`.`project_name`, `wu`.`location`, `wu`.`department`, " - + "`wu`.`contractor_name`, `wu`.`contractor_period`, `wu`.`fund_source`, `wu`.`scheme`, `wu`.`category`, `wu`.`sub_category` AS `sub_category`, " - + "`wu`.`est_amount`, `wu`.`tech_sanc_date`, `wu`.`admin_sanc_date`, `wu`.`tender_call_date`, `wu`.`tender_fin_date`, " - + "`wu`.`loa_date`, `wu`.`agreement_date`, `wu`.`work_order_date`, `wu`.`work_comm_date` " - + "FROM `works_update` `wu` LEFT JOIN EGW_TYPEOFWORK `tw` ON trim(`tw`.description) = trim(`wu`.`sub_category`)"; - */ - - String where = getWardByLoginId(loginid,"ae"); - //System.out.println("ward: "+ward); + /* + * String sql = + * "SELECT wu.`Id` AS estid, `wu`.`sub_category` AS works, tw.id AS typeofworkid, `wu`.`estimate_no`, " + * + + * "`wu`.`estimate_date`, `wu`.`zone`, `wu`.`ward`, `wu`.`project_name`, `wu`.`location`, `wu`.`department`, " + * + + * "`wu`.`contractor_name`, `wu`.`contractor_period`, `wu`.`fund_source`, `wu`.`scheme`, `wu`.`category`, `wu`.`sub_category` AS `sub_category`, " + * + + * "`wu`.`est_amount`, `wu`.`tech_sanc_date`, `wu`.`admin_sanc_date`, `wu`.`tender_call_date`, `wu`.`tender_fin_date`, " + * + + * "`wu`.`loa_date`, `wu`.`agreement_date`, `wu`.`work_order_date`, `wu`.`work_comm_date` " + * + + * "FROM `works_update` `wu` LEFT JOIN EGW_TYPEOFWORK `tw` ON trim(`tw`.description) = trim(`wu`.`sub_category`)" + * ; + */ + + String where = getWardByLoginId(loginid, "ae"); + // System.out.println("ward: "+ward); String sql = "SELECT " + "wu.`estid` AS estid, " + "tm.`description` AS works, " @@ -219,114 +227,252 @@ public class WorksService { + "wu.`work_order_date` AS `work_order_date`, " + "wu.`work_commenced_date` AS `work_comm_date`, " + "wu.`percentage` AS `percentage` " - + "FROM `erp_works` wu " - //+ "LEFT JOIN typeofwork_master tw ON trim(tw.description) = trim(wu.`sub_category`)" + + "FROM `works_details` wu " + // + "LEFT JOIN typeofwork_master tw ON trim(tw.description) = + // trim(wu.`sub_category`)" + "LEFT JOIN department_master dm ON dm.id = wu.`department`" + "LEFT JOIN fundsource_master fs ON fs.id = wu.`fund_source` " + "LEFT JOIN scheme_master s ON s.id = wu.`scheme` " + "LEFT JOIN workstype_master wm ON wm.id = wu.`category` " + "LEFT JOIN typeofwork_master tm ON tm.id = wu.`sub_category` " - + "WHERE "+where; - - List> result = jdbcWorksTemplate.queryForList(sql); - /* - List> estWorklistData = new ArrayList<>(); - - for (Map row : result) { - // CHECK IN WORK_TASK - - // CHECK IN typeofwork_task_master - - // CHECK IN task_data last DATA for each typeofwork_task_master - } - */ - - return jdbcWorksTemplate.queryForList(sql); - } - + + "WHERE " + where; + + List> result = jdbcWorksTemplate.queryForList(sql); + /* + * List> estWorklistData = new ArrayList<>(); + * + * for (Map row : result) { + * // CHECK IN WORK_TASK + * + * // CHECK IN typeofwork_task_master + * + * // CHECK IN task_data last DATA for each typeofwork_task_master + * } + */ + + return jdbcWorksTemplate.queryForList(sql); + } + /* - public List> getTaskDataListWithData(String estid, String typeofworkid) { - String sql = "SELECT `tdid`, `estid`, `tmid`, `percentage`, `cdate`, `cby`, `zone`, `ward`, `latitude`, `longitude`, `stage_file`, `status`, `isactive` FROM `task_data` WHERE 1"; - return jdbcWorksTemplate.queryForList(sql,typeofworkid); - } - */ - - public List> getESTWorkListData(String estid) { - - String sql = "SELECT `id` AS wtid, `estid`, `estimate_no`, `sub_cat_id`, `question_id`, `ans_id`," - + " `remarks`, `cdate`, `isactive`, `isdelete`, `percentage` " - + " FROM `erp_works_task` " - + " WHERE `isactive`=1 AND `isdelete`=0 AND `estid`= ?"; - - List> result = jdbcWorksTemplate.queryForList(sql, estid); - - // Prepare the response - Map response = new HashMap<>(); - response.put("estWorklistData", result); - response.put("message", "EST Activity Data List."); - - // Return the response wrapped in a singleton list - return Collections.singletonList(response); + * public List> getTaskDataListWithData(String estid, String + * typeofworkid) { + * String sql = + * "SELECT `tdid`, `estid`, `tmid`, `percentage`, `cdate`, `cby`, `zone`, `ward`, `latitude`, `longitude`, `stage_file`, `status`, `isactive` FROM `task_data` WHERE 1" + * ; + * return jdbcWorksTemplate.queryForList(sql,typeofworkid); + * } + */ + + public List> getESTWorkListData(String estid, String typeofworkid) { + + // String sql = "SELECT `id` AS wtid, `estid`, `estimate_no`, `sub_cat_id`, + // `question_id`, `ans_id`," + // + " `remarks`, `cdate`, `isactive`, `isdelete`, `percentage` " + // + " FROM `erp_works_task` " + // + " WHERE `isactive`=1 AND `isdelete`=0 AND `estid`= ?"; + Map result = new HashMap<>(); + + String sql = "select id, api_name from addworks_question_master where subcategory_id = " + typeofworkid + + " and question_name in ('Zone','Ward','Road or Street Name')"; + List> result1 = jdbcWorksTemplate.queryForList(sql); + if (result1.isEmpty()) { + result.put("estWorklistData", new ArrayList<>()); + result.put("message", "No Activity Question ID found against this category"); + return Collections.singletonList(result); + } + int zoneQuestionId = 0; + int wardQuestionId = 0; + int roadQuestionId = 0; + for (Map row : result1) { + if (row.get("api_name").equals("ZONE")) { + zoneQuestionId = Integer.parseInt(row.get("id").toString()); + } + if (row.get("api_name").equals("WARD")) { + wardQuestionId = Integer.parseInt(row.get("id").toString()); + } + if (row.get("api_name").equals("ROAD")) { + roadQuestionId = Integer.parseInt(row.get("id").toString()); + } + } + + String sql1 = "SELECT " + + "ewt.id AS wtid, " + + "ewt.estid, " + + "ewt.estimate_no, " + + "ewt.sub_cat_id, " + + "ifnull(ewt.question_id,'') as question_id, " + + "ewt.ans_id, " + + "ewt.remarks, " + + "ewt.cdate, " + + "ewt.isactive, " + + "ewt.isdelete, " + + "ewt.percentage, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.answer END), '') AS road_name, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.ref_id END), '') AS roadRefId, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.answer END), '') AS zone, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.answer END), '') AS ward " + + "FROM erp_works_task ewt " + + "LEFT JOIN addworks_text_details atd " + + "ON ewt.ref_id = atd.ref_id " + + "AND ewt.estid = atd.estid " + + "WHERE atd.isactive = 1 " + + "AND atd.isdelete = 0 " + + "AND ewt.isactive = 1 " + + "AND ewt.isdelete = 0 " + + "AND ewt.estid = ? " + + "GROUP BY " + + "ewt.id, " + + "ewt.estid, " + + "ewt.estimate_no, " + + "ewt.sub_cat_id, " + + "ewt.question_id, " + + "ewt.ans_id, " + + "ewt.remarks, " + + "ewt.cdate, " + + "ewt.isactive, " + + "ewt.isdelete, " + + "ewt.percentage"; + + List> result2 = jdbcWorksTemplate.queryForList(sql1, roadQuestionId, roadQuestionId, + zoneQuestionId, wardQuestionId, estid); + + Map response = new HashMap<>(); + response.put("estWorklistData", result2); + response.put("message", "EST Activity Data List."); + + return Collections.singletonList(response); } - public List> getTaskDataListWithData(String wtid, String estid, String typeofworkid) { - - String sql = "SELECT `id`, `estid`, `estimate_no`, `sub_cat_id`, `question_id`, `ans_id`," - + " `remarks`, `cdate`, `isactive`, `isdelete`, `percentage` FROM `erp_works_task` " - + "WHERE `id`=? AND `estid`= ? AND `isactive`=1 AND `isdelete`=0"; - - List> result = jdbcWorksTemplate.queryForList(sql, wtid, estid); - - List> estTaskWorklistData = new ArrayList<>(); - - for (Map row : result) { - - // Query for the task related to the current activity - String sqlForTask = "SELECT `tmid`, `stagename` AS `taskname`, `isactive`, `isdelete`, `orderby`, " - + "(" - + " SELECT `percentage` " - + " FROM `erp_task_data` " - + " WHERE `tmid` = `erp_works_stages`.`tmid` AND wtid=? AND `isactive`=1 " - + " ORDER BY `cdate` DESC " - + " LIMIT 1 " - + " ) AS percentage " - + "FROM `erp_works_stages` WHERE `isactive`=1 AND `isdelete`=0 AND `estid`=? ORDER BY `orderby`"; - - List> taskresult = jdbcWorksTemplate.queryForList(sqlForTask, wtid, estid); - - if (!taskresult.isEmpty()) { - // For each task in the taskresult, add taskdataresult - for (Map task : taskresult) { - // Query for the task-related data - String tmid = ""+task.get("tmid"); // Assuming tmid is a field in task - String sqlForTaskData = "SELECT `tdid`, `estid`, `tmid`, `percentage`, `remarks`, " - + "DATE_FORMAT(`cdate`, '%d-%m-%Y %r') AS createddate, " - + "`cby`, `zone`, `ward`, `latitude`, `longitude`, " - + " CONCAT('"+fileBaseUrl+"/gccofficialapp/files', `stage_file`) AS image, " - + "`status`, `isactive` FROM `erp_task_data` WHERE `wtid`=? AND `tmid`=? AND `estid`=? AND `isactive`=1"; - - List> taskdataresult = jdbcWorksTemplate.queryForList(sqlForTaskData, wtid, tmid, estid); - - // Add taskdataresult to each task - task.put("taskdata", taskdataresult); - } - } - // Add tasklist (with taskdata) to the row - row.put("tasklist", taskresult); - - // Add the row to SWDData - estTaskWorklistData.add(row); - } - - // Prepare the response - Map response = new HashMap<>(); - response.put("estTaskWorklistData", estTaskWorklistData); - response.put("message", "EST Activity Data List."); - - // Return the response wrapped in a singleton list - return Collections.singletonList(response); + public List> getTaskDataListWithData(String wtid, String estid, String typeofworkid, + String refId) { + + // String sql = "SELECT `id`, `estid`, `estimate_no`, `sub_cat_id`, + // `question_id`, `ans_id`," + // + " `remarks`, `cdate`, `isactive`, `isdelete`, `percentage` FROM + // `erp_works_task` " + // + "WHERE `id`=? AND `estid`= ? AND `isactive`=1 AND `isdelete`=0"; + + // List> result = jdbcWorksTemplate.queryForList(sql, wtid, + // estid); + + Map result = new HashMap<>(); + + String sql = "select id, api_name from addworks_question_master where subcategory_id = ? " + + " and question_name in ('Zone','Ward','Road or Street Name')"; + List> result1 = jdbcWorksTemplate.queryForList(sql, typeofworkid); + if (result1.isEmpty()) { + result.put("estWorklistData", new ArrayList<>()); + result.put("message", "No Activity Question ID found against this category"); + return Collections.singletonList(result); + } + int zoneQuestionId = 0; + int wardQuestionId = 0; + int roadQuestionId = 0; + for (Map row : result1) { + if (row.get("api_name").equals("ZONE")) { + zoneQuestionId = Integer.parseInt(row.get("id").toString()); + } + if (row.get("api_name").equals("WARD")) { + wardQuestionId = Integer.parseInt(row.get("id").toString()); + } + if (row.get("api_name").equals("ROAD")) { + roadQuestionId = Integer.parseInt(row.get("id").toString()); + } + } + + String sql1 = "SELECT " + + "ewt.id AS wtid, " + + "ewt.estid, " + + "ewt.estimate_no, " + + "ewt.sub_cat_id, " + + "ifnull(ewt.question_id,'') as question_id, " + + "ewt.ans_id, " + + "ewt.remarks, " + + "ewt.cdate, " + + "ewt.isactive, " + + "ewt.isdelete, " + + "ewt.percentage, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.answer END), '') AS road_name, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.ref_id END), '') AS roadRefId, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.answer END), '') AS zone, " + + "IFNULL(MAX(CASE WHEN atd.question_id = ? THEN atd.answer END), '') AS ward " + + "FROM erp_works_task ewt " + + "LEFT JOIN addworks_text_details atd " + + "ON ewt.ref_id = atd.ref_id " + + "AND ewt.estid = atd.estid " + + "WHERE atd.isactive = 1 " + + "AND atd.isdelete = 0 " + + "AND ewt.isactive = 1 " + + "AND ewt.isdelete = 0 " + + "AND ewt.estid = ? and ewt.id = ? " + + "GROUP BY " + + "ewt.id, " + + "ewt.estid, " + + "ewt.estimate_no, " + + "ewt.sub_cat_id, " + + "ewt.question_id, " + + "ewt.ans_id, " + + "ewt.remarks, " + + "ewt.cdate, " + + "ewt.isactive, " + + "ewt.isdelete, " + + "ewt.percentage"; + + List> result2 = jdbcWorksTemplate.queryForList(sql1, roadQuestionId, roadQuestionId, + zoneQuestionId, wardQuestionId, estid, wtid); + + List> estTaskWorklistData = new ArrayList<>(); + + for (Map row : result2) { + + // Query for the task related to the current activity - need to change this + // query + String sqlForTask = "SELECT `tmid`, `stagename` AS `taskname`, `isactive`, `isdelete`, `orderby`, " + + "(" + + " SELECT `percentage` " + + " FROM `erp_task_data` " + + " WHERE `tmid` = `erp_works_stages`.`tmid` AND wtid=? AND `isactive`=1 " + + " ORDER BY `cdate` DESC " + + " LIMIT 1 " + + " ) AS percentage " + + "FROM `erp_works_stages` WHERE `isactive`=1 AND `isdelete`=0 AND `estid`=? AND `ref_id`= ? AND `isactive`=1 ORDER BY `orderby`"; + + List> taskresult = jdbcWorksTemplate.queryForList(sqlForTask, wtid, estid, refId); + + if (!taskresult.isEmpty()) { + // For each task in the taskresult, add taskdataresult + for (Map task : taskresult) { + // Query for the task-related data + String tmid = "" + task.get("tmid"); // Assuming tmid is a field in task + String sqlForTaskData = "SELECT `tdid`, `estid`, `ref_id`, `tmid`, `percentage`, `remarks`, " + + "DATE_FORMAT(`cdate`, '%d-%m-%Y %r') AS createddate, " + + "`cby`, `zone`, `ward`, `latitude`, `longitude`, " + + " CONCAT('" + fileBaseUrl + "/gccofficialapp/files', `stage_file`) AS image, " + + "`status`, `isactive` FROM `erp_task_data` WHERE `wtid`=? AND `tmid`=? AND `estid`=? AND `ref_id`= ? AND `isactive`=1"; + + List> taskdataresult = jdbcWorksTemplate.queryForList(sqlForTaskData, wtid, + tmid, estid, refId); + + // Add taskdataresult to each task + task.put("taskdata", taskdataresult); + } + } + // Add tasklist (with taskdata) to the row + row.put("tasklist", taskresult); + + // Add the row to SWDData + estTaskWorklistData.add(row); + } + + // Prepare the response + Map response = new HashMap<>(); + response.put("estTaskWorklistData", estTaskWorklistData); + response.put("message", "EST Activity Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); } - + @Transactional public List> addTaskStageActivityData( String estid, @@ -340,70 +486,72 @@ public class WorksService { String ward, String latitude, String longitude, - String status) { + String status, + String refId) { List> result = null; Map response = new HashMap<>(); - + int lastInsertId = 0; - + String filetxt = ""; - + // Handle file upload if a file is provided if (file != null && !file.isEmpty()) { - filetxt = fileUpload(estid+"_"+tmid, cby, file); + filetxt = fileUpload(estid + "_" + tmid, cby, file); } String finalfile = filetxt; String sqlQuery = "INSERT INTO `erp_task_data`" - + "(`estid`, `tmid`, `percentage`, `remarks`, `cby`, `zone`, `ward`, `latitude`, `longitude`, `stage_file`, `status`,`wtid`) " - + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; + + "(`estid`, `tmid`, `percentage`, `remarks`, `cby`, `zone`, `ward`, `latitude`, `longitude`, `stage_file`, `status`,`wtid`, `ref_id`) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); - + LocalDateTime approvedDate = LocalDateTime.now(); String formattedDate = approvedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - + try { status = "open"; - if(percentage.contains("100")) { + if (percentage.contains("100")) { status = "close"; } - + String statustxt = status; - - // Insert the data the required number of times - int affectedRows = jdbcWorksTemplate.update(new PreparedStatementCreator() { - @Override - public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { - PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[] { "did" }); - ps.setString(1, estid); - ps.setString(2, tmid); - ps.setString(3, percentage); - ps.setString(4, remarks); - ps.setString(5, cby); - ps.setString(6, zone); - ps.setString(7, ward); - ps.setString(8, latitude); - ps.setString(9, longitude); - ps.setString(10, finalfile); - ps.setString(11, statustxt); - ps.setString(12, wtid); - return ps; - } - }, keyHolder); - - if (affectedRows > 0) { - Number generatedId = keyHolder.getKey(); - lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; - response.put("insertId", lastInsertId); - response.put("status", "success"); - response.put("message", "Stage Task data inserted successfully!"); - System.out.println("Stage Task was inserted successfully! Insert ID: " + generatedId); - updateStatus(percentage, estid, wtid); - } else { - response.put("status", "error"); - response.put("message", "Failed to insert stage task data."); + + // Insert the data the required number of times + int affectedRows = jdbcWorksTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[] { "did" }); + ps.setString(1, estid); + ps.setString(2, tmid); + ps.setString(3, percentage); + ps.setString(4, remarks); + ps.setString(5, cby); + ps.setString(6, zone); + ps.setString(7, ward); + ps.setString(8, latitude); + ps.setString(9, longitude); + ps.setString(10, finalfile); + ps.setString(11, statustxt); + ps.setString(12, wtid); + ps.setString(13, refId); + return ps; } + }, keyHolder); + + if (affectedRows > 0) { + Number generatedId = keyHolder.getKey(); + lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; + response.put("insertId", lastInsertId); + response.put("status", "success"); + response.put("message", "Stage Task data inserted successfully!"); + System.out.println("Stage Task was inserted successfully! Insert ID: " + generatedId); + updateStatus(percentage, estid, wtid); + } else { + response.put("status", "error"); + response.put("message", "Failed to insert stage task data."); + } } catch (DataAccessException e) { System.out.println("Data Access Exception:"); Throwable rootCause = e.getMostSpecificCause(); @@ -422,42 +570,54 @@ public class WorksService { response.put("message", rootCause.getMessage()); } } -/* - // Update Percentage of works progress - String sqlUpdateQuery ="UPDATE erp_works ew " - + "JOIN ( " - + " SELECT " - + " ew.estid, " - + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress " - + " FROM erp_works ew " - + " JOIN erp_works_task ewt ON ewt.estid = ew.estid " - + " JOIN erp_works_stages ews ON ews.estid = ew.estid " - + " LEFT JOIN erp_task_data etd " - + " ON etd.estid = ew.estid " - + " AND etd.wtid = ewt.id " - + " AND etd.tmid = ews.tmid " - + " GROUP BY ew.estid " - + " HAVING physical_progress > 0 " - + ") AS prog " - + "ON ew.estid = prog.estid " - + "SET " - + " ew.percentage = prog.physical_progress, " - + " ew.update_status = CASE " - + " WHEN prog.physical_progress = 0 THEN 'pending' " - + " WHEN prog.physical_progress < 100 THEN 'Inprogress' " - + " ELSE 'Completed' " - + " END"; -*/ - String sqlUpdateQuery ="UPDATE erp_works ew " + + // String sqlUpdateQuery = "UPDATE erp_works ew " + // + "JOIN ( " + // + " SELECT " + // + " ew.estid, " + // + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS + // physical_progress " + // + " FROM erp_works ew " + // + " JOIN erp_works_task ewt ON ewt.estid = ew.estid " + // + " JOIN erp_works_stages ews ON ews.estid = ew.estid " + // + " LEFT JOIN ( " + // // + " -- Get only the latest active record per (estid, wtid, tmid) " + // + " SELECT etd.* " + // + " FROM erp_task_data etd " + // + " INNER JOIN ( " + // + " SELECT estid, wtid, tmid, MAX(tdid) AS max_tdid " + // + " FROM erp_task_data " + // + " WHERE isactive = 1 " + // + " GROUP BY estid, wtid, tmid " + // + " ) latest ON latest.estid = etd.estid " + // + " AND latest.wtid = etd.wtid " + // + " AND latest.tmid = etd.tmid " + // + " AND latest.max_tdid = etd.tdid " + // + " ) etd ON etd.estid = ew.estid " + // + " AND etd.wtid = ewt.id " + // + " AND etd.tmid = ews.tmid " + // + " GROUP BY ew.estid " + // + " HAVING physical_progress > 0 " + // + ") AS prog " + // + "ON ew.estid = prog.estid " + // + "SET " + // + " ew.percentage = prog.physical_progress, " + // + " ew.update_status = CASE " + // + " WHEN prog.physical_progress = 0 THEN 'pending' " + // + " WHEN prog.physical_progress < 100 THEN 'Inprogress' " + // + " ELSE 'Completed' " + // + " END"; + + String sqlUpdateQuery = "UPDATE works_details ew " + "JOIN ( " + " SELECT " + " ew.estid, " + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress " - + " FROM erp_works ew " + + " FROM works_details ew " + " JOIN erp_works_task ewt ON ewt.estid = ew.estid " + " JOIN erp_works_stages ews ON ews.estid = ew.estid " + " LEFT JOIN ( " - //+ " -- Get only the latest active record per (estid, wtid, tmid) " + // + " -- Get only the latest active record per (estid, wtid, tmid) " + " SELECT etd.* " + " FROM erp_task_data etd " + " INNER JOIN ( " @@ -483,42 +643,63 @@ public class WorksService { + " WHEN prog.physical_progress < 100 THEN 'Inprogress' " + " ELSE 'Completed' " + " END"; - + System.out.println("Percentage Update : " + sqlUpdateQuery + " --> ESTID : " + estid); jdbcWorksTemplate.update(sqlUpdateQuery); - + return Collections.singletonList(response); } - - public boolean updateStatus(String percentage,String estid, String wtid) { + + public boolean updateStatus(String percentage, String estid, String wtid) { int statusAffected = 0; - /* - String selectSql = "SELECT " - + " ewt.id," - + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress" - + " FROM erp_works ew" - + " JOIN erp_works_task ewt ON ewt.estid = ew.estid" - + " JOIN erp_works_stages ews ON ews.estid = ew.estid" - + " LEFT JOIN erp_task_data etd " - + " ON etd.estid = ew.estid " - + " AND etd.wtid = ewt.id " - + " AND etd.tmid = ews.tmid" - + " AND ewt.id = ?" - + " GROUP BY ew.estid" - + " HAVING physical_progress > 0"; - */ - - String selectSql ="SELECT " + + // String selectSql = "SELECT " + // + " ewt.id, " + // + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS + // physical_progress " + // + "FROM " + // + " erp_works ew " + // + "JOIN " + // + " erp_works_task ewt ON ewt.estid = ew.estid " + // + "JOIN " + // + " erp_works_stages ews ON ews.estid = ew.estid " + // + "LEFT JOIN ( " + // // + " -- Subquery to get only latest entry per estid/wtid/tmid based on + // highest + // // tdid " + // + " SELECT etd.* " + // + " FROM erp_task_data etd " + // + " INNER JOIN ( " + // + " SELECT estid, wtid, tmid, MAX(tdid) AS max_tdid " + // + " FROM erp_task_data " + // + " WHERE isactive = 1 " + // + " GROUP BY estid, wtid, tmid " + // + " ) latest ON latest.estid = etd.estid " + // + " AND latest.wtid = etd.wtid " + // + " AND latest.tmid = etd.tmid " + // + " AND latest.max_tdid = etd.tdid " + // + ") etd ON etd.estid = ew.estid " + // + " AND etd.wtid = ewt.id " + // + " AND etd.tmid = ews.tmid " + // + "WHERE " + // + " ewt.id = ? " + // + "GROUP BY " + // + " ew.estid " + // + "HAVING " + // + " physical_progress > 0"; + + String selectSql = "SELECT " + " ewt.id, " + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress " + "FROM " - + " erp_works ew " + + " works_details ew " + "JOIN " + " erp_works_task ewt ON ewt.estid = ew.estid " + "JOIN " + " erp_works_stages ews ON ews.estid = ew.estid " + "LEFT JOIN ( " - //+ " -- Subquery to get only latest entry per estid/wtid/tmid based on highest tdid " + // + " -- Subquery to get only latest entry per estid/wtid/tmid based on highest + // tdid " + " SELECT etd.* " + " FROM erp_task_data etd " + " INNER JOIN ( " @@ -539,161 +720,160 @@ public class WorksService { + " ew.estid " + "HAVING " + " physical_progress > 0"; - - List> rows = jdbcWorksTemplate.queryForList(selectSql, new Object[]{wtid}); + + List> rows = jdbcWorksTemplate.queryForList(selectSql, new Object[] { wtid }); for (Map row : rows) { - int physical_progress = ((Number) row.get("physical_progress")).intValue(); + int physical_progress = ((Number) row.get("physical_progress")).intValue(); - String updateSql = "UPDATE `erp_works_task` SET `percentage`=? WHERE `estid`=? AND `id`=?"; - statusAffected = jdbcWorksTemplate.update(updateSql, physical_progress, estid, wtid); + String updateSql = "UPDATE `erp_works_task` SET `percentage`=? WHERE `estid`=? AND `id`=?"; + statusAffected = jdbcWorksTemplate.update(updateSql, physical_progress, estid, wtid); - System.out.println("Updated " + statusAffected + " row(s) for estid=" + estid + ", wtid=" + wtid); + System.out.println("Updated " + statusAffected + " row(s) for estid=" + estid + ", wtid=" + wtid); } - - // System.out.println("UPDATE `erp_works_task` SET `percentage`="+percentage+" WHERE `estid`="+estid+" AND `id`="+wtid); - // System.out.println("UPDATE `erp_works_task` Status: " + statusAffected); - - //int rowsAffected = 0; - //if (statusAffected > 0) { - /* - sqlQuery = "UPDATE `works_update` SET `percentage`=? WHERE `id`=?"; - rowsAffected = jdbcWorksTemplate.update(sqlQuery, new Object[]{percentage,estid}); - - System.out.println("UPDATE `works_update` SET `percentage`="+percentage+" WHERE `id`="+estid); - System.out.println("UPDATE `works_update` Status: " + rowsAffected); - */ - //} - return true; + + // System.out.println("UPDATE `erp_works_task` SET `percentage`="+percentage+" + // WHERE `estid`="+estid+" AND `id`="+wtid); + // System.out.println("UPDATE `erp_works_task` Status: " + statusAffected); + + // int rowsAffected = 0; + // if (statusAffected > 0) { + /* + * sqlQuery = "UPDATE `works_update` SET `percentage`=? WHERE `id`=?"; + * rowsAffected = jdbcWorksTemplate.update(sqlQuery, new + * Object[]{percentage,estid}); + * + * System.out.println("UPDATE `works_update` SET `percentage`=" + * +percentage+" WHERE `id`="+estid); + * System.out.println("UPDATE `works_update` Status: " + rowsAffected); + */ + // } + return true; } - - + public List> getZoneReport() { - - String sql = "SELECT " - + " CASE " - + " WHEN zone = '00' THEN 'HQ' " - + " ELSE zone " - + " END AS zone, " - + " COUNT(estid) AS Total, " - + " SUM(CASE WHEN percentage = 100 THEN 1 ELSE 0 END) AS CompletedTotal, " - + " SUM(CASE WHEN percentage > 0 AND percentage < 100 THEN 1 ELSE 0 END) AS OngoingTotal, " - + " SUM(CASE WHEN percentage = 0 THEN 1 ELSE 0 END) AS NotStartedTotal " - + "FROM " - + " `erp_works` " - + "GROUP BY " - + " zone " - + "ORDER BY " - + " zone;"; - - List> result = jdbcWorksTemplate.queryForList(sql); - - // Prepare the response - Map response = new HashMap<>(); - response.put("ZoneData", result); - response.put("message", "EST Activity Zone Data List."); - - // Return the response wrapped in a singleton list - return Collections.singletonList(response); + + String sql = "SELECT " + + " CASE " + + " WHEN zone = '00' THEN 'HQ' " + + " ELSE zone " + + " END AS zone, " + + " COUNT(estid) AS Total, " + + " SUM(CASE WHEN percentage = 100 THEN 1 ELSE 0 END) AS CompletedTotal, " + + " SUM(CASE WHEN percentage > 0 AND percentage < 100 THEN 1 ELSE 0 END) AS OngoingTotal, " + + " SUM(CASE WHEN percentage = 0 THEN 1 ELSE 0 END) AS NotStartedTotal " + + "FROM " + + " `works_details` " + + "GROUP BY " + + " zone " + + "ORDER BY " + + " zone;"; + + List> result = jdbcWorksTemplate.queryForList(sql); + + // Prepare the response + Map response = new HashMap<>(); + response.put("ZoneData", result); + response.put("message", "EST Activity Zone Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); } - + public List> getWardReport(String zone) { - - String sql = "SELECT " - + " CASE " - + " WHEN zone = '00' THEN 'HQ' " - + " ELSE zone " - + " END AS zone, " - + " CASE " - + " WHEN ward = '000' THEN 'HQ' " - + " ELSE ward " - + " END AS ward, " - + " COUNT(estid) AS Total, " - + " SUM(CASE WHEN percentage = 100 THEN 1 ELSE 0 END) AS CompletedTotal, " - + " SUM(CASE WHEN percentage > 0 AND percentage < 100 THEN 1 ELSE 0 END) AS OngoingTotal, " - + " SUM(CASE WHEN percentage = 0 THEN 1 ELSE 0 END) AS NotStartedTotal " - + "FROM " - + " `erp_works` " - + "WHERE zone=? " - + "GROUP BY " - + " zone, ward " - + "ORDER BY " - + " ward"; - - List> result = jdbcWorksTemplate.queryForList(sql,zone); - - // Prepare the response - Map response = new HashMap<>(); - response.put("estWorklistData", result); - response.put("message", "EST Activity Data List."); - - // Return the response wrapped in a singleton list - return Collections.singletonList(response); + + String sql = "SELECT " + + " CASE " + + " WHEN zone = '00' THEN 'HQ' " + + " ELSE zone " + + " END AS zone, " + + " CASE " + + " WHEN ward = '000' THEN 'HQ' " + + " ELSE ward " + + " END AS ward, " + + " COUNT(estid) AS Total, " + + " SUM(CASE WHEN percentage = 100 THEN 1 ELSE 0 END) AS CompletedTotal, " + + " SUM(CASE WHEN percentage > 0 AND percentage < 100 THEN 1 ELSE 0 END) AS OngoingTotal, " + + " SUM(CASE WHEN percentage = 0 THEN 1 ELSE 0 END) AS NotStartedTotal " + + "FROM " + + " `works_details` " + + "WHERE zone=? " + + "GROUP BY " + + " zone, ward " + + "ORDER BY " + + " ward"; + + List> result = jdbcWorksTemplate.queryForList(sql, zone); + + // Prepare the response + Map response = new HashMap<>(); + response.put("estWorklistData", result); + response.put("message", "EST Activity Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); } public List> getListReport(String ward, String statusFilter) { - - StringBuilder sqlBuilder = new StringBuilder("SELECT " - + "wu.`estid` AS estid, " - + "tm.`description` AS works, " - + "tm.id AS typeofworkid, " - + "wu.`estimate_no`, " - + "wu.`estimate_date`, " - + "wu.`zone`, " - + "wu.`ward`, " - + "wu.`project_name`, " - + "wu.`location`, " - + "dm.`dept_name` AS `department`, " - + "wu.`contractor_name`, " - + "CAST(wu.contractor_period AS CHAR) AS contractor_period, " - + "fs.`name` AS `fund_source`, " - + "s.`name` AS `scheme`, " - + "wm.`name` AS `category`, " - + "tm.`description` AS `sub_category`, " - + "wu.`estimation_amount` AS `est_amount`, " - + "wu.`technical_sanction_date` AS `tech_sanc_date`, " - + "wu.`admin_sanction_date` AS `admin_sanc_date`, " - + "wu.`tender_called_date` AS `tender_call_date`, " - + "wu.`tender_finalized_date` AS `tender_fin_date`, " - + "wu.`loa_date` AS `loa_date`, " - + "wu.`agreement_date` AS `agreement_date`, " - + "wu.`work_order_date` AS `work_order_date`, " - + "wu.`work_commenced_date` AS `work_comm_date`, " - + "wu.`percentage` AS `percentage` " - + "FROM `erp_works` wu " - + "LEFT JOIN department_master dm ON dm.id = wu.`department` " - + "LEFT JOIN fundsource_master fs ON fs.id = wu.`fund_source` " - + "LEFT JOIN scheme_master s ON s.id = wu.`scheme` " - + "LEFT JOIN workstype_master wm ON wm.id = wu.`category` " - + "LEFT JOIN typeofwork_master tm ON tm.id = wu.`sub_category` " - + "WHERE wu.`ward` = '" + ward + "' "); + + "wu.`estid` AS estid, " + + "tm.`description` AS works, " + + "tm.id AS typeofworkid, " + + "wu.`estimate_no`, " + + "wu.`estimate_date`, " + + "wu.`zone`, " + + "wu.`ward`, " + + "wu.`project_name`, " + + "wu.`location`, " + + "dm.`dept_name` AS `department`, " + + "wu.`contractor_name`, " + + "CAST(wu.contractor_period AS CHAR) AS contractor_period, " + + "fs.`name` AS `fund_source`, " + + "s.`name` AS `scheme`, " + + "wm.`name` AS `category`, " + + "tm.`description` AS `sub_category`, " + + "wu.`estimation_amount` AS `est_amount`, " + + "wu.`technical_sanction_date` AS `tech_sanc_date`, " + + "wu.`admin_sanction_date` AS `admin_sanc_date`, " + + "wu.`tender_called_date` AS `tender_call_date`, " + + "wu.`tender_finalized_date` AS `tender_fin_date`, " + + "wu.`loa_date` AS `loa_date`, " + + "wu.`agreement_date` AS `agreement_date`, " + + "wu.`work_order_date` AS `work_order_date`, " + + "wu.`work_commenced_date` AS `work_comm_date`, " + + "wu.`percentage` AS `percentage` " + + "FROM `works_details` wu " + + "LEFT JOIN department_master dm ON dm.id = wu.`department` " + + "LEFT JOIN fundsource_master fs ON fs.id = wu.`fund_source` " + + "LEFT JOIN scheme_master s ON s.id = wu.`scheme` " + + "LEFT JOIN workstype_master wm ON wm.id = wu.`category` " + + "LEFT JOIN typeofwork_master tm ON tm.id = wu.`sub_category` " + + "WHERE wu.`ward` = '" + ward + "' "); switch (statusFilter) { - case "completed": - sqlBuilder.append("AND wu.percentage = 100 "); - break; - case "ongoing": - sqlBuilder.append("AND wu.percentage > 0 AND wu.percentage < 100 "); - break; - case "not_started": - sqlBuilder.append("AND wu.percentage = 0 "); - break; - // default is no filtering (all) + case "completed": + sqlBuilder.append("AND wu.percentage = 100 "); + break; + case "ongoing": + sqlBuilder.append("AND wu.percentage > 0 AND wu.percentage < 100 "); + break; + case "not_started": + sqlBuilder.append("AND wu.percentage = 0 "); + break; + // default is no filtering (all) } String sql = sqlBuilder.toString(); List> result = jdbcWorksTemplate.queryForList(sql); - - // Prepare the response - Map response = new HashMap<>(); - response.put("estWorklistData", result); - response.put("message", "EST Data List."); - - // Return the response wrapped in a singleton list - return Collections.singletonList(response); + + // Prepare the response + Map response = new HashMap<>(); + response.put("estWorklistData", result); + response.put("message", "EST Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); } - - + } diff --git a/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService1.java b/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService1.java new file mode 100644 index 00000000..2cd73eeb --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/mobileservice/works/service/WorksService1.java @@ -0,0 +1,737 @@ +package in.gov.chennaicorporation.mobileservice.works.service; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.SecureRandom; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import in.gov.chennaicorporation.mobileservice.gccactivity.service.DateTimeUtil; + +@Service +public class WorksService1 { + private JdbcTemplate jdbcWorksTemplate; + + private final Environment environment; + private String fileBaseUrl; + + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private static final int STRING_LENGTH = 15; + private static final Random RANDOM = new SecureRandom(); + + @Autowired + public void setDataSource(@Qualifier("mysqlWorksDataSource") DataSource worksDataSource) { + this.jdbcWorksTemplate = new JdbcTemplate(worksDataSource); + } + + @Autowired + public WorksService1(Environment environment) { + this.environment = environment; + this.fileBaseUrl = environment.getProperty("fileBaseUrl"); + } + + public static String generateRandomString() { + StringBuilder result = new StringBuilder(STRING_LENGTH); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + + public static String generateRandomStringForFile(int String_Lenth) { + StringBuilder result = new StringBuilder(String_Lenth); + for (int i = 0; i < STRING_LENGTH; i++) { + result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); + } + return result.toString(); + } + + private byte[] compressImage(BufferedImage image, float quality) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream); + + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + writer.setOutput(imageOutputStream); + + ImageWriteParam param = writer.getDefaultWriteParam(); + if (param.canWriteCompressed()) { + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(quality); + } + + writer.write(null, new javax.imageio.IIOImage(image, null, null), param); + + writer.dispose(); + imageOutputStream.close(); + + return byteArrayOutputStream.toByteArray(); + } + + public String fileUpload(String name, String id, MultipartFile file) { + + int lastInsertId = 0; + // Set the file path where you want to save it + String uploadDirectory = environment.getProperty("file.upload.directory"); + String serviceFolderName = environment.getProperty("works_task_foldername"); + var year = DateTimeUtil.getCurrentYear(); + var month = DateTimeUtil.getCurrentMonth(); + var date = DateTimeUtil.getCurrentDay(); + + uploadDirectory = uploadDirectory + serviceFolderName + year + "/" + month + "/" + date; + + try { + // Create directory if it doesn't exist + Path directoryPath = Paths.get(uploadDirectory); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + // Datetime string + String datetimetxt = DateTimeUtil.getCurrentDateTime(); + // File name + System.out.println(file.getOriginalFilename()); + String fileName = name + "_" + id + "_" + datetimetxt + "_" + generateRandomStringForFile(10) + "_" + + file.getOriginalFilename(); + fileName = fileName.replaceAll("\\s+", ""); // Remove space on filename + + String filePath = uploadDirectory + "/" + fileName; + + String filepath_txt = "/" + serviceFolderName + year + "/" + month + "/" + date + "/" + fileName; + + // Create a new Path object + Path path = Paths.get(filePath); + + // Get the bytes of the file + byte[] bytes = file.getBytes(); + + // Compress the image + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality + + // Write the bytes to the file + Files.write(path, compressedBytes); + + System.out.println(filePath); + return filepath_txt; + + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save file " + file.getOriginalFilename(); + } + } + + public String getWardByLoginId(String loginid, String type) { + String sqlQuery = "SELECT `ward`, `works` FROM `gcc_penalty_hoardings`.`hoading_user_list` WHERE `userid` = ? LIMIT 1"; + + List> results = jdbcWorksTemplate.queryForList(sqlQuery, loginid); + + if (!results.isEmpty()) { + Map row = results.get(0); + String wardClause; + String departmentClause = ""; + + Object wardValue = row.get("ward"); + Object worksValue = row.get("works"); + + if (wardValue == null || wardValue.toString().equals("0")) { + wardClause = "wu.`ward` NOT IN (0)"; + } else { + wardClause = "wu.`ward` IN ('" + wardValue + "')"; + } + + if (worksValue != null) { + departmentClause = " AND wu.`department` IN (" + worksValue + ")"; + } + + return wardClause + departmentClause; + } + + return "wu.`ward` IN ('-')"; + } + + public List> getESTList(String loginid) { + /* + * String sql = + * "SELECT wu.`Id` AS estid, `wu`.`sub_category` AS works, tw.id AS typeofworkid, `wu`.`estimate_no`, " + * + + * "`wu`.`estimate_date`, `wu`.`zone`, `wu`.`ward`, `wu`.`project_name`, `wu`.`location`, `wu`.`department`, " + * + + * "`wu`.`contractor_name`, `wu`.`contractor_period`, `wu`.`fund_source`, `wu`.`scheme`, `wu`.`category`, `wu`.`sub_category` AS `sub_category`, " + * + + * "`wu`.`est_amount`, `wu`.`tech_sanc_date`, `wu`.`admin_sanc_date`, `wu`.`tender_call_date`, `wu`.`tender_fin_date`, " + * + + * "`wu`.`loa_date`, `wu`.`agreement_date`, `wu`.`work_order_date`, `wu`.`work_comm_date` " + * + + * "FROM `works_update` `wu` LEFT JOIN EGW_TYPEOFWORK `tw` ON trim(`tw`.description) = trim(`wu`.`sub_category`)" + * ; + */ + + String where = getWardByLoginId(loginid, "ae"); + // System.out.println("ward: "+ward); + String sql = "SELECT " + + "wu.`estid` AS estid, " + + "tm.`description` AS works, " + + "tm.id AS typeofworkid, " + + "wu.`estimate_no`, " + + "wu.`estimate_date`, " + + "wu.`zone`, " + + "wu.`ward`, " + + "wu.`project_name`, " + + "wu.`location`, " + + "dm.`dept_name` AS `department`, " + + "wu.`contractor_name`, " + + "CAST(wu.contractor_period AS CHAR) AS contractor_period, " + + "fs.`name` AS `fund_source`, " + + "s.`name` AS `scheme`, " + + "wm.`name` AS `category`, " + + "tm.`description` AS `sub_category`, " + + "wu.`estimation_amount` AS `est_amount`, " + + "wu.`technical_sanction_date` AS `tech_sanc_date`, " + + "wu.`admin_sanction_date` AS `admin_sanc_date`, " + + "wu.`tender_called_date` AS `tender_call_date`, " + + "wu.`tender_finalized_date` AS `tender_fin_date`, " + + "wu.`loa_date` AS `loa_date`, " + + "wu.`agreement_date` AS `agreement_date`, " + + "wu.`work_order_date` AS `work_order_date`, " + + "wu.`work_commenced_date` AS `work_comm_date`, " + + "wu.`percentage` AS `percentage` " + + "FROM `erp_works` wu " + // + "LEFT JOIN typeofwork_master tw ON trim(tw.description) = + // trim(wu.`sub_category`)" + + "LEFT JOIN department_master dm ON dm.id = wu.`department`" + + "LEFT JOIN fundsource_master fs ON fs.id = wu.`fund_source` " + + "LEFT JOIN scheme_master s ON s.id = wu.`scheme` " + + "LEFT JOIN workstype_master wm ON wm.id = wu.`category` " + + "LEFT JOIN typeofwork_master tm ON tm.id = wu.`sub_category` " + + "WHERE " + where; + + List> result = jdbcWorksTemplate.queryForList(sql); + /* + * List> estWorklistData = new ArrayList<>(); + * + * for (Map row : result) { + * // CHECK IN WORK_TASK + * + * // CHECK IN typeofwork_task_master + * + * // CHECK IN task_data last DATA for each typeofwork_task_master + * } + */ + + return jdbcWorksTemplate.queryForList(sql); + } + + /* + * public List> getTaskDataListWithData(String estid, String + * typeofworkid) { + * String sql = + * "SELECT `tdid`, `estid`, `tmid`, `percentage`, `cdate`, `cby`, `zone`, `ward`, `latitude`, `longitude`, `stage_file`, `status`, `isactive` FROM `task_data` WHERE 1" + * ; + * return jdbcWorksTemplate.queryForList(sql,typeofworkid); + * } + */ + + public List> getESTWorkListData(String estid) { + + // String sql = "SELECT `id` AS wtid, `estid`, `estimate_no`, `sub_cat_id`, + // `question_id`, `ans_id`," + // + " `remarks`, `cdate`, `isactive`, `isdelete`, `percentage` " + // + " FROM `erp_works_task` " + // + " WHERE `isactive`=1 AND `isdelete`=0 AND `estid`= ?"; + + String sql = "SELECT " + + " ewt.id AS wtid, " + + " ewt.estid, " + + " ewt.estimate_no, " + + " ewt.sub_cat_id, " + + " ewt.question_id, " + + " ewt.ans_id, " + + " ewt.remarks, " + + " ewt.cdate, " + + " ewt.isactive, " + + " ewt.isdelete, " + + " ewt.percentage " + + // " atd.answer as road_name, " + + // " atd.ref_id as roadRefId " + + "FROM erp_works_task ewt " + + // "left join addworks_text_details atd on ewt.ref_id = atd.ref_id and ewt.estid + // = atd.estid " + + // "WHERE atd.question_id = 3 and atd.isactive =1 and atd.isdelete = 0 and " + + "WHERE ewt.isactive = 1 " + + "AND ewt.isdelete = 0 " + + "AND ewt.estid = ?"; + + List> result = jdbcWorksTemplate.queryForList(sql, estid); + + // Prepare the response + Map response = new HashMap<>(); + response.put("estWorklistData", result); + response.put("message", "EST Activity Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); + } + + public List> getTaskDataListWithData(String wtid, String estid, String typeofworkid) { + + String sql = "SELECT `id`, `estid`, `estimate_no`, `sub_cat_id`, `question_id`, `ans_id`," + + " `remarks`, `cdate`, `isactive`, `isdelete`, `percentage` FROM `erp_works_task` " + + "WHERE `id`=? AND `estid`= ? AND `isactive`=1 AND `isdelete`=0"; + + List> result = jdbcWorksTemplate.queryForList(sql, wtid, estid); + + List> estTaskWorklistData = new ArrayList<>(); + + for (Map row : result) { + + // Query for the task related to the current activity + String sqlForTask = "SELECT `tmid`, `stagename` AS `taskname`, `isactive`, `isdelete`, `orderby`, " + + "(" + + " SELECT `percentage` " + + " FROM `erp_task_data` " + + " WHERE `tmid` = `erp_works_stages`.`tmid` AND wtid=? AND `isactive`=1 " + + " ORDER BY `cdate` DESC " + + " LIMIT 1 " + + " ) AS percentage " + + "FROM `erp_works_stages` WHERE `isactive`=1 AND `isdelete`=0 AND `estid`=? ORDER BY `orderby`"; + + List> taskresult = jdbcWorksTemplate.queryForList(sqlForTask, wtid, estid); + + if (!taskresult.isEmpty()) { + // For each task in the taskresult, add taskdataresult + for (Map task : taskresult) { + // Query for the task-related data + String tmid = "" + task.get("tmid"); // Assuming tmid is a field in task + String sqlForTaskData = "SELECT `tdid`, `estid`, `tmid`, `percentage`, `remarks`, " + + "DATE_FORMAT(`cdate`, '%d-%m-%Y %r') AS createddate, " + + "`cby`, `zone`, `ward`, `latitude`, `longitude`, " + + " CONCAT('" + fileBaseUrl + "/gccofficialapp/files', `stage_file`) AS image, " + + "`status`, `isactive` FROM `erp_task_data` WHERE `wtid`=? AND `tmid`=? AND `estid`=? AND `isactive`=1"; + + List> taskdataresult = jdbcWorksTemplate.queryForList(sqlForTaskData, wtid, + tmid, estid); + + // Add taskdataresult to each task + task.put("taskdata", taskdataresult); + } + } + // Add tasklist (with taskdata) to the row + row.put("tasklist", taskresult); + + // Add the row to SWDData + estTaskWorklistData.add(row); + } + + // Prepare the response + Map response = new HashMap<>(); + response.put("estTaskWorklistData", estTaskWorklistData); + response.put("message", "EST Activity Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); + } + + @Transactional + public List> addTaskStageActivityData( + String estid, + String tmid, + String wtid, + MultipartFile file, + String percentage, + String remarks, + String cby, + String zone, + String ward, + String latitude, + String longitude, + String status) { + List> result = null; + Map response = new HashMap<>(); + + int lastInsertId = 0; + + String filetxt = ""; + + // Handle file upload if a file is provided + if (file != null && !file.isEmpty()) { + filetxt = fileUpload(estid + "_" + tmid, cby, file); + } + String finalfile = filetxt; + String sqlQuery = "INSERT INTO `erp_task_data`" + + "(`estid`, `tmid`, `percentage`, `remarks`, `cby`, `zone`, `ward`, `latitude`, `longitude`, `stage_file`, `status`,`wtid`) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + LocalDateTime approvedDate = LocalDateTime.now(); + + String formattedDate = approvedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + + try { + status = "open"; + if (percentage.contains("100")) { + status = "close"; + } + + String statustxt = status; + + // Insert the data the required number of times + int affectedRows = jdbcWorksTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[] { "did" }); + ps.setString(1, estid); + ps.setString(2, tmid); + ps.setString(3, percentage); + ps.setString(4, remarks); + ps.setString(5, cby); + ps.setString(6, zone); + ps.setString(7, ward); + ps.setString(8, latitude); + ps.setString(9, longitude); + ps.setString(10, finalfile); + ps.setString(11, statustxt); + ps.setString(12, wtid); + return ps; + } + }, keyHolder); + + if (affectedRows > 0) { + Number generatedId = keyHolder.getKey(); + lastInsertId = (generatedId != null) ? generatedId.intValue() : 0; + response.put("insertId", lastInsertId); + response.put("status", "success"); + response.put("message", "Stage Task data inserted successfully!"); + System.out.println("Stage Task was inserted successfully! Insert ID: " + generatedId); + updateStatus(percentage, estid, wtid); + } else { + response.put("status", "error"); + response.put("message", "Failed to insert stage task data."); + } + } catch (DataAccessException e) { + System.out.println("Data Access Exception:"); + Throwable rootCause = e.getMostSpecificCause(); + if (rootCause instanceof SQLException) { + SQLException sqlException = (SQLException) rootCause; + System.out.println("SQL State: " + sqlException.getSQLState()); + System.out.println("Error Code: " + sqlException.getErrorCode()); + System.out.println("Message: " + sqlException.getMessage()); + response.put("status", "error"); + response.put("message", sqlException.getMessage()); + response.put("sqlState", sqlException.getSQLState()); + response.put("errorCode", sqlException.getErrorCode()); + } else { + System.out.println("Message: " + rootCause.getMessage()); + response.put("status", "error"); + response.put("message", rootCause.getMessage()); + } + } + /* + * // Update Percentage of works progress + * String sqlUpdateQuery ="UPDATE erp_works ew " + * + "JOIN ( " + * + " SELECT " + * + " ew.estid, " + * + + * " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress " + * + " FROM erp_works ew " + * + " JOIN erp_works_task ewt ON ewt.estid = ew.estid " + * + " JOIN erp_works_stages ews ON ews.estid = ew.estid " + * + " LEFT JOIN erp_task_data etd " + * + " ON etd.estid = ew.estid " + * + " AND etd.wtid = ewt.id " + * + " AND etd.tmid = ews.tmid " + * + " GROUP BY ew.estid " + * + " HAVING physical_progress > 0 " + * + ") AS prog " + * + "ON ew.estid = prog.estid " + * + "SET " + * + " ew.percentage = prog.physical_progress, " + * + " ew.update_status = CASE " + * + " WHEN prog.physical_progress = 0 THEN 'pending' " + * + " WHEN prog.physical_progress < 100 THEN 'Inprogress' " + * + " ELSE 'Completed' " + * + " END"; + */ + String sqlUpdateQuery = "UPDATE erp_works ew " + + "JOIN ( " + + " SELECT " + + " ew.estid, " + + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress " + + " FROM erp_works ew " + + " JOIN erp_works_task ewt ON ewt.estid = ew.estid " + + " JOIN erp_works_stages ews ON ews.estid = ew.estid " + + " LEFT JOIN ( " + // + " -- Get only the latest active record per (estid, wtid, tmid) " + + " SELECT etd.* " + + " FROM erp_task_data etd " + + " INNER JOIN ( " + + " SELECT estid, wtid, tmid, MAX(tdid) AS max_tdid " + + " FROM erp_task_data " + + " WHERE isactive = 1 " + + " GROUP BY estid, wtid, tmid " + + " ) latest ON latest.estid = etd.estid " + + " AND latest.wtid = etd.wtid " + + " AND latest.tmid = etd.tmid " + + " AND latest.max_tdid = etd.tdid " + + " ) etd ON etd.estid = ew.estid " + + " AND etd.wtid = ewt.id " + + " AND etd.tmid = ews.tmid " + + " GROUP BY ew.estid " + + " HAVING physical_progress > 0 " + + ") AS prog " + + "ON ew.estid = prog.estid " + + "SET " + + " ew.percentage = prog.physical_progress, " + + " ew.update_status = CASE " + + " WHEN prog.physical_progress = 0 THEN 'pending' " + + " WHEN prog.physical_progress < 100 THEN 'Inprogress' " + + " ELSE 'Completed' " + + " END"; + + System.out.println("Percentage Update : " + sqlUpdateQuery + " --> ESTID : " + estid); + jdbcWorksTemplate.update(sqlUpdateQuery); + + return Collections.singletonList(response); + } + + public boolean updateStatus(String percentage, String estid, String wtid) { + int statusAffected = 0; + /* + * String selectSql = "SELECT " + * + " ewt.id," + * + + * " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress" + * + " FROM erp_works ew" + * + " JOIN erp_works_task ewt ON ewt.estid = ew.estid" + * + " JOIN erp_works_stages ews ON ews.estid = ew.estid" + * + " LEFT JOIN erp_task_data etd " + * + " ON etd.estid = ew.estid " + * + " AND etd.wtid = ewt.id " + * + " AND etd.tmid = ews.tmid" + * + " AND ewt.id = ?" + * + " GROUP BY ew.estid" + * + " HAVING physical_progress > 0"; + */ + + String selectSql = "SELECT " + + " ewt.id, " + + " ROUND(SUM(COALESCE(etd.percentage, 0)) / COUNT(*), 0) AS physical_progress " + + "FROM " + + " erp_works ew " + + "JOIN " + + " erp_works_task ewt ON ewt.estid = ew.estid " + + "JOIN " + + " erp_works_stages ews ON ews.estid = ew.estid " + + "LEFT JOIN ( " + // + " -- Subquery to get only latest entry per estid/wtid/tmid based on highest + // tdid " + + " SELECT etd.* " + + " FROM erp_task_data etd " + + " INNER JOIN ( " + + " SELECT estid, wtid, tmid, MAX(tdid) AS max_tdid " + + " FROM erp_task_data " + + " WHERE isactive = 1 " + + " GROUP BY estid, wtid, tmid " + + " ) latest ON latest.estid = etd.estid " + + " AND latest.wtid = etd.wtid " + + " AND latest.tmid = etd.tmid " + + " AND latest.max_tdid = etd.tdid " + + ") etd ON etd.estid = ew.estid " + + " AND etd.wtid = ewt.id " + + " AND etd.tmid = ews.tmid " + + "WHERE " + + " ewt.id = ? " + + "GROUP BY " + + " ew.estid " + + "HAVING " + + " physical_progress > 0"; + + List> rows = jdbcWorksTemplate.queryForList(selectSql, new Object[] { wtid }); + + for (Map row : rows) { + int physical_progress = ((Number) row.get("physical_progress")).intValue(); + + String updateSql = "UPDATE `erp_works_task` SET `percentage`=? WHERE `estid`=? AND `id`=?"; + statusAffected = jdbcWorksTemplate.update(updateSql, physical_progress, estid, wtid); + + System.out.println("Updated " + statusAffected + " row(s) for estid=" + estid + ", wtid=" + wtid); + } + + // System.out.println("UPDATE `erp_works_task` SET `percentage`="+percentage+" + // WHERE `estid`="+estid+" AND `id`="+wtid); + // System.out.println("UPDATE `erp_works_task` Status: " + statusAffected); + + // int rowsAffected = 0; + // if (statusAffected > 0) { + /* + * sqlQuery = "UPDATE `works_update` SET `percentage`=? WHERE `id`=?"; + * rowsAffected = jdbcWorksTemplate.update(sqlQuery, new + * Object[]{percentage,estid}); + * + * System.out.println("UPDATE `works_update` SET `percentage`=" + * +percentage+" WHERE `id`="+estid); + * System.out.println("UPDATE `works_update` Status: " + rowsAffected); + */ + // } + return true; + } + + public List> getZoneReport() { + + String sql = "SELECT " + + " CASE " + + " WHEN zone = '00' THEN 'HQ' " + + " ELSE zone " + + " END AS zone, " + + " COUNT(estid) AS Total, " + + " SUM(CASE WHEN percentage = 100 THEN 1 ELSE 0 END) AS CompletedTotal, " + + " SUM(CASE WHEN percentage > 0 AND percentage < 100 THEN 1 ELSE 0 END) AS OngoingTotal, " + + " SUM(CASE WHEN percentage = 0 THEN 1 ELSE 0 END) AS NotStartedTotal " + + "FROM " + + " `erp_works` " + + "GROUP BY " + + " zone " + + "ORDER BY " + + " zone;"; + + List> result = jdbcWorksTemplate.queryForList(sql); + + // Prepare the response + Map response = new HashMap<>(); + response.put("ZoneData", result); + response.put("message", "EST Activity Zone Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); + } + + public List> getWardReport(String zone) { + + String sql = "SELECT " + + " CASE " + + " WHEN zone = '00' THEN 'HQ' " + + " ELSE zone " + + " END AS zone, " + + " CASE " + + " WHEN ward = '000' THEN 'HQ' " + + " ELSE ward " + + " END AS ward, " + + " COUNT(estid) AS Total, " + + " SUM(CASE WHEN percentage = 100 THEN 1 ELSE 0 END) AS CompletedTotal, " + + " SUM(CASE WHEN percentage > 0 AND percentage < 100 THEN 1 ELSE 0 END) AS OngoingTotal, " + + " SUM(CASE WHEN percentage = 0 THEN 1 ELSE 0 END) AS NotStartedTotal " + + "FROM " + + " `erp_works` " + + "WHERE zone=? " + + "GROUP BY " + + " zone, ward " + + "ORDER BY " + + " ward"; + + List> result = jdbcWorksTemplate.queryForList(sql, zone); + + // Prepare the response + Map response = new HashMap<>(); + response.put("estWorklistData", result); + response.put("message", "EST Activity Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); + } + + public List> getListReport(String ward, String statusFilter) { + + StringBuilder sqlBuilder = new StringBuilder("SELECT " + + "wu.`estid` AS estid, " + + "tm.`description` AS works, " + + "tm.id AS typeofworkid, " + + "wu.`estimate_no`, " + + "wu.`estimate_date`, " + + "wu.`zone`, " + + "wu.`ward`, " + + "wu.`project_name`, " + + "wu.`location`, " + + "dm.`dept_name` AS `department`, " + + "wu.`contractor_name`, " + + "CAST(wu.contractor_period AS CHAR) AS contractor_period, " + + "fs.`name` AS `fund_source`, " + + "s.`name` AS `scheme`, " + + "wm.`name` AS `category`, " + + "tm.`description` AS `sub_category`, " + + "wu.`estimation_amount` AS `est_amount`, " + + "wu.`technical_sanction_date` AS `tech_sanc_date`, " + + "wu.`admin_sanction_date` AS `admin_sanc_date`, " + + "wu.`tender_called_date` AS `tender_call_date`, " + + "wu.`tender_finalized_date` AS `tender_fin_date`, " + + "wu.`loa_date` AS `loa_date`, " + + "wu.`agreement_date` AS `agreement_date`, " + + "wu.`work_order_date` AS `work_order_date`, " + + "wu.`work_commenced_date` AS `work_comm_date`, " + + "wu.`percentage` AS `percentage` " + + "FROM `erp_works` wu " + + "LEFT JOIN department_master dm ON dm.id = wu.`department` " + + "LEFT JOIN fundsource_master fs ON fs.id = wu.`fund_source` " + + "LEFT JOIN scheme_master s ON s.id = wu.`scheme` " + + "LEFT JOIN workstype_master wm ON wm.id = wu.`category` " + + "LEFT JOIN typeofwork_master tm ON tm.id = wu.`sub_category` " + + "WHERE wu.`ward` = '" + ward + "' "); + + switch (statusFilter) { + case "completed": + sqlBuilder.append("AND wu.percentage = 100 "); + break; + case "ongoing": + sqlBuilder.append("AND wu.percentage > 0 AND wu.percentage < 100 "); + break; + case "not_started": + sqlBuilder.append("AND wu.percentage = 0 "); + break; + // default is no filtering (all) + } + + String sql = sqlBuilder.toString(); + List> result = jdbcWorksTemplate.queryForList(sql); + + // Prepare the response + Map response = new HashMap<>(); + response.put("estWorklistData", result); + response.put("message", "EST Data List."); + + // Return the response wrapped in a singleton list + return Collections.singletonList(response); + } + +}