package in.gov.chennaicorporation.gccoffice.cdwaste.service; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; 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.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; @Service public class OfficerService { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private RestTemplate restTemplate; @Autowired private SMSService smsService; @Autowired public void setDataSourcemysql(@Qualifier("mysqlCDManagerSystemDataSource") DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Transactional public void saveRequestDetails(Map payload) { double actualWeight = Double.parseDouble(payload.get("actualWeight").toString()); String paymentType = payload.get("paymentType").toString(); /* * double processingCharge = * Double.parseDouble(payload.get("processingCharge").toString()); double * wasteCharge = Double.parseDouble(payload.get("wasteCharge").toString()); */ double processingCharge = payload.get("processingCharge") != null ? Double.parseDouble(payload.get("processingCharge").toString()) : 0.0; double wasteCharge = payload.get("wasteCharge") != null ? Double.parseDouble(payload.get("wasteCharge").toString()) : 0.0; double totalCharge = Double.parseDouble(payload.get("totalCharge").toString()); String paymentMobNo = payload.get("paymentMobileNo") != null ? payload.get("paymentMobileNo").toString() : null; String refId = payload.get("refId") != null ? payload.get("refId").toString() : null; // ✅ Check if record exists String checkSql = "SELECT COUNT(*) FROM waste_collectors_request WHERE refid = ?"; Integer count = jdbcTemplate.queryForObject(checkSql, new Object[]{refId}, Integer.class); if (count != null && count > 0) { // ✅ Update the existing record String updateSql = "UPDATE waste_collectors_request SET actual_weight = ?, payment_type = ?, processing_charge = ?, waste_collection_charge = ?, total_charge = ?, payment_mobile_no = ? WHERE refid = ?"; jdbcTemplate.update(updateSql, actualWeight, paymentType, processingCharge, wasteCharge, totalCharge, paymentMobNo, refId); // ✅ Send WhatsApp message if payment type is 'generateLink' and mobile number is provided if ("generateLink".equalsIgnoreCase(paymentType) && paymentMobNo != null && !paymentMobNo.isBlank()) { sendWhatsappMessage(refId, actualWeight, totalCharge, paymentMobNo); } } else { throw new RuntimeException("No request found for Ref ID: " + refId); } } public void sendWhatsappMessage(String refId, double actualWeight, double totalCharge, String mobileNumber) { try { String message = String.format( "Your request (Request ID: *%s*) has been processed. Please proceed with the payment.\n\nActual Weight: *%.0f kg*\nAmount Payable: *%.0f*", refId, actualWeight, totalCharge ); String encodedMessage = URLEncoder.encode(message, StandardCharsets.UTF_8); String encodedHeader = URLEncoder.encode("C&D Waste Collection – Payment Request", StandardCharsets.UTF_8); String encodedFooter = URLEncoder.encode("Greater Chennai Corporation", StandardCharsets.UTF_8); String redirectUrlParam = URLEncoder.encode("dumpregistration/paymentform?requestId=" + refId, StandardCharsets.UTF_8); String apiUrl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507" + "&password=h2YjFNcJ" + "&send_to=" + mobileNumber + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE" + "&msg=" + encodedMessage + "&isTemplate=true" + "&header=" + encodedHeader + "&footer=" + encodedFooter + "&buttonUrlParam=" + redirectUrlParam; // Optional: log URL before hitting for debugging System.out.println("WhatsApp API URL: " + apiUrl); // Make API call // restTemplate.getForObject(apiUrl, String.class); smsService.sendMsg(apiUrl); } catch (Exception e) { e.printStackTrace(); // Optionally log or alert failure } } public List> getAllRequestDetails(LocalDate fromDate, LocalDate toDate, String wastequantity, String zone) { StringBuilder query = new StringBuilder( "SELECT wcr.id, wcr.name, wcr.mobile_no, wcr.area, wcr.zone, qm.quantity, " + "wtm.waste_type, dl.location, wcr.actual_weight, wcr.payment_status,wcr.waste_collection_charge, " + "wcr.processing_charge, wcr.total_charge, DATE_FORMAT(wcr.cdate, '%d-%m-%Y') AS request_date, wcr.refid " + "FROM waste_collectors_request wcr " + "JOIN dumping_location dl ON wcr.dump_location_id = dl.id " + "JOIN waste_type_master wtm ON wcr.waste_type_id = wtm.id " + "JOIN quantity_master qm ON wcr.waste_quantity_id = qm.id " + "WHERE wcr.cdate BETWEEN ? AND ?"); LocalDateTime fromDateTime = fromDate.atStartOfDay(); LocalDateTime toDateTime = toDate.atTime(LocalTime.MAX); List params = new ArrayList<>(); params.add(fromDateTime); params.add(toDateTime); if (wastequantity != null && !wastequantity.isEmpty()) { query.append(" AND qm.quantity = ?"); params.add(wastequantity); } if (zone != null && !zone.isEmpty()) { query.append(" AND wcr.zone = ?"); params.add(zone); } return jdbcTemplate.queryForList(query.toString(), params.toArray()); } public List> getAllwastequantity() { String sql = " SELECT id,quantity FROM quantity_master where is_active = 1 "; return jdbcTemplate.queryForList(sql); } public List> getZonesList() { String sql = " SELECT id,zone_name from zones where is_active = 1 "; return jdbcTemplate.queryForList(sql); } }