diff --git a/src/main/java/com/gcc/commissionerreview/controller/FoodDistrubutionReportApiController.java b/src/main/java/com/gcc/commissionerreview/controller/FoodDistrubutionReportApiController.java new file mode 100644 index 0000000..0850325 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/FoodDistrubutionReportApiController.java @@ -0,0 +1,70 @@ +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.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.Fooddistributionservice; + +@RestController +@RequestMapping("/commissionerreview/api/fooddistribution") +public class FoodDistrubutionReportApiController { + + @Autowired + private Fooddistributionservice fooddistributionservice; + + @GetMapping("/categories") + public ResponseEntity> getQuestions() { + Map response = new HashMap<>(); + try { + List> questions = fooddistributionservice.getQuestions(); + response.put("status", "success"); + response.put("data", questions); + } catch (Exception e) { + response.put("status", "error"); + response.put("message", e.getMessage()); + } + return ResponseEntity.ok(response); + } + + @GetMapping("/complianceAbstract") + public ResponseEntity> getComplianceAbstractReport( + @RequestParam(value = "date", required = false) String date) { + Map response = new HashMap<>(); + try { + List> reportData = fooddistributionservice.getComplianceAbstractReport(date); + response.put("status", "success"); + response.put("data", reportData); + } catch (Exception e) { + response.put("status", "error"); + response.put("message", e.getMessage()); + } + return ResponseEntity.ok(response); + } + + @GetMapping("/complianceDetails") + public ResponseEntity> getComplianceDetailedReport( + @RequestParam(value = "date", required = false) String date, + @RequestParam("hubId") Integer hubId, + @RequestParam("qid") Integer qid, + @RequestParam("statusFilter") String statusFilter) { + Map response = new HashMap<>(); + try { + List> detailedData = fooddistributionservice.getComplianceDetailedReport(date, hubId, + qid, statusFilter); + response.put("status", "success"); + response.put("data", detailedData); + } catch (Exception e) { + response.put("status", "error"); + response.put("message", e.getMessage()); + } + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/gcc/commissionerreview/controller/MainController.java b/src/main/java/com/gcc/commissionerreview/controller/MainController.java index a5b85e3..d2a4e6e 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/MainController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/MainController.java @@ -301,4 +301,9 @@ public class MainController { return "modules/bulkwaste/bulkwastereport"; } + @GetMapping("/fooddistributionreport") + public String fooddistributionreport(Model model) { + return "modules/fooddistribution/fooddistributionreport"; + } + } diff --git a/src/main/java/com/gcc/commissionerreview/service/Fooddistributionservice.java b/src/main/java/com/gcc/commissionerreview/service/Fooddistributionservice.java new file mode 100644 index 0000000..fdc4ece --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/Fooddistributionservice.java @@ -0,0 +1,107 @@ +package com.gcc.commissionerreview.service; + +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 Fooddistributionservice { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Value("${fileBaseUrl:}") + private String fileBaseUrl; + + @Autowired + public void setDataSource(@Qualifier("mysqlFoodDistributionDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public List> getQuestions() { + String sql = "SELECT qcm.qcm_id, qcm.audit_category, pqm.qid, pqm.q_english " + + "FROM pmc_questions_master pqm " + + "JOIN questions_category_master qcm ON pqm.qcm_id = qcm.qcm_id " + + "WHERE pqm.isactive = 1 AND pqm.isdelete = 0 AND qcm.isactive = 1 AND qcm.isdelete = 0 " + + "ORDER BY qcm.orderby, pqm.orderby"; + return jdbcTemplate.queryForList(sql); + } + + public List> getComplianceAbstractReport(String date) { + String dateFilter = ""; + if (date != null && !date.trim().isEmpty()) { + dateFilter = " AND DATE(pa.audit_date) = ? "; + } + + String sql = "SELECT " + + "hm.id AS hub_id, hm.zone, hm.ward, hm.permanent_location, hm.si_name, " + + "qcm.qcm_id, qcm.audit_category, " + + "pqm.qid, pqm.q_english, " + + "pam.english_name AS answer_status, " + + "COUNT(pf.id) AS issue_count " + + "FROM hub_master hm " + + "LEFT JOIN pmc_audit pa ON pa.hub_id = hm.id AND pa.isactive = 1 AND pa.isdelete = 0 " + dateFilter + + "LEFT JOIN pmc_feedback pf ON pf.pmc_audit_id = pa.id AND pf.isactive = 1 AND pf.isdelete = 0 " + + "LEFT JOIN pmc_questions_master pqm ON pqm.qid = pf.questions AND pqm.isactive = 1 AND pqm.isdelete = 0 " + + "LEFT JOIN questions_category_master qcm ON qcm.qcm_id = pqm.qcm_id AND qcm.isactive = 1 AND qcm.isdelete = 0 " + + "LEFT JOIN pmc_answer_master pam ON pam.aid = pf.answer AND pam.isactive = 1 AND pam.isdelete = 0 " + + "WHERE hm.is_active = 1 AND hm.is_delete = 0 " + + "GROUP BY hm.id, hm.zone, hm.ward, hm.permanent_location, hm.si_name, qcm.qcm_id, qcm.audit_category, pqm.qid, pqm.q_english, pam.english_name " + + "ORDER BY hm.id, qcm.orderby, pqm.orderby"; + + if (date != null && !date.trim().isEmpty()) { + return jdbcTemplate.queryForList(sql, date); + } else { + return jdbcTemplate.queryForList(sql); + } + } + + public List> getComplianceDetailedReport(String date, Integer hubId, Integer qid, String status) { + String dateFilter = ""; + if (date != null && !date.trim().isEmpty()) { + dateFilter = " AND DATE(pa.audit_date) = ? "; + } + + String sql = "SELECT " + + "pf.id, " + + "DATE_FORMAT(pa.audit_date, '%d/%m/%y %H:%i') AS auditDate, " + + "pa.shiftid, " + // Assuming shiftid is used; update if shift_master exists + "hm.zone, " + + "hm.ward, " + + "pa.address, " + + "qcm.audit_category, " + + "pqm.q_english, " + + "pam.english_name, " + + "hm.si_name AS name, " + + "dl.name AS raisedBy, " + + "pf.remarks AS pmcRemarks, " + + "CONCAT('" + fileBaseUrl + "/gccofficialapp/files', pf.image) AS videoLink, " + + "pf.food_swing_sts AS fsStatus, " + + "dl2.name AS fsChallengedBy, " + + "pf.fs_remarks AS fsRemarks, " + + "CONCAT('" + fileBaseUrl + "/gccofficialapp/files', pf.fs_image) AS fsVideoLink " + + "FROM pmc_feedback pf " + + "JOIN pmc_audit pa ON pa.id = pf.pmc_audit_id AND pa.isactive = 1 AND pa.isdelete = 0 " + dateFilter + + "JOIN hub_master hm ON hm.id = pa.hub_id AND hm.id = ? " + + "JOIN pmc_questions_master pqm ON pqm.qid = pf.questions AND pqm.qid = ? " + + "JOIN questions_category_master qcm ON qcm.qcm_id = pf.qcmid " + + "JOIN pmc_answer_master pam ON pam.aid = pf.answer AND pam.english_name = ? " + + "LEFT JOIN driver_login dl ON pa.cby = dl.loginid " + + "LEFT JOIN driver_login dl2 ON pf.fs_cby = dl2.loginid " + + "WHERE pf.isactive = 1 AND pf.isdelete = 0 " + + "ORDER BY pf.id DESC"; + + if (date != null && !date.trim().isEmpty()) { + return jdbcTemplate.queryForList(sql, date, hubId, qid, status); + } else { + return jdbcTemplate.queryForList(sql, hubId, qid, status); + } + } +} diff --git a/src/main/resources/templates/modules/fooddistribution/fooddistributionreport.html b/src/main/resources/templates/modules/fooddistribution/fooddistributionreport.html new file mode 100644 index 0000000..527bc08 --- /dev/null +++ b/src/main/resources/templates/modules/fooddistribution/fooddistributionreport.html @@ -0,0 +1,543 @@ + + + + + Food Distribution FSSAI Compliance Report + + + + + + + + + + + + + + +
+
+

Food Distribution FSSAI Compliance Report

+
+ + +
+
+ + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + +
Zone + Kitchen Name / Address
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file