diff --git a/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java b/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java index 563334e4..6126b8bd 100644 --- a/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java +++ b/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java @@ -2,12 +2,11 @@ import com.iemr.common.service.grievance.GrievanceDataSync; +import com.iemr.common.service.grievance.GrievanceHandlingService; import com.iemr.common.utils.exception.IEMRException; import com.iemr.common.utils.response.OutputResponse; - +import io.lettuce.core.dynamic.annotation.Param; import io.swagger.v3.oas.annotations.Operation; - - import javax.ws.rs.core.MediaType; import org.json.JSONException; @@ -16,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @@ -24,11 +24,15 @@ public class GrievanceController { private GrievanceDataSync grievanceDataSync; + + private final GrievanceHandlingService grievanceHandlingService; @Autowired - public GrievanceController(GrievanceDataSync grievanceDataSync) { + public GrievanceController(GrievanceHandlingService grievanceHandlingService, GrievanceDataSync grievanceDataSync) { this.grievanceDataSync = grievanceDataSync; + this.grievanceHandlingService = grievanceHandlingService; } + @CrossOrigin() @Operation(summary = "/unallocatedGrievanceCount") @@ -53,4 +57,27 @@ public String fetchUnallocatedGrievanceCount() { return responseData.toString(); } + + + + @Operation(summary = "Allocate grievances to users") + @PostMapping(value = "/allocateGrievances", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, headers = "Authorization") + public String allocateGrievances(@Param(value = "{\"startDate\":\"ISO-8601 format start date (e.g., 2022-12-01T07:49:00.000Z)\", " + + "\"endDate\":\"ISO-8601 format end date (e.g., 2025-01-16T07:49:30.561)\", " + + "\"userID\":\"Array list of User IDs (agents to be allocated grievances)\", " + + "\"allocateNo\":\"Integer - number of grievances to be allocated to each user\"," + + "\"language\":\"String - language to filter grievances by\"}") + + @RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + // Call the service to allocate grievances based on the incoming JSON request + response.setResponse(grievanceHandlingService.allocateGrievances(request)); + } catch (Exception e) { + logger.error("Grievance allocation failed with error: " + e.getMessage(), e); + response.setError(e); + } + return response.toString(); + } + } diff --git a/src/main/java/com/iemr/common/data/grievance/GrievanceAllocationRequest.java b/src/main/java/com/iemr/common/data/grievance/GrievanceAllocationRequest.java new file mode 100644 index 00000000..7bf44e44 --- /dev/null +++ b/src/main/java/com/iemr/common/data/grievance/GrievanceAllocationRequest.java @@ -0,0 +1,68 @@ +package com.iemr.common.data.grievance; + + + import java.time.LocalDateTime; + import java.util.List; + + public class GrievanceAllocationRequest { + + private LocalDateTime startDate; // Start date for filtering grievances + private LocalDateTime endDate; // End date for filtering grievances + private List userID; // List of user IDs (agents) to whom grievances will be allocated + private Integer allocateNo; // Number of grievances to be allocated to each user + private String language; + // Getters and Setters + + public LocalDateTime getStartDate() { + return startDate; + } + + public void setStartDate(LocalDateTime startDate) { + this.startDate = startDate; + } + + public LocalDateTime getEndDate() { + return endDate; + } + + public void setEndDate(LocalDateTime endDate) { + this.endDate = endDate; + } + + public List getUserID() { + return userID; + } + + public void setUserID(List userID) { + this.userID = userID; + } + + public Integer getAllocateNo() { + return allocateNo; + } + + public void setAllocateNo(Integer allocateNo) { + this.allocateNo = allocateNo; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + @Override + public String toString() { + return "GrievanceAllocationRequest{" + + "startDate=" + startDate + + ", endDate=" + endDate + + ", userID=" + userID + + ", allocateNo=" + allocateNo + + ", language=" + language + + '}'; + } + + +} diff --git a/src/main/java/com/iemr/common/data/grievance/GrievanceDetails.java b/src/main/java/com/iemr/common/data/grievance/GrievanceDetails.java index 160d0d83..52659c3b 100644 --- a/src/main/java/com/iemr/common/data/grievance/GrievanceDetails.java +++ b/src/main/java/com/iemr/common/data/grievance/GrievanceDetails.java @@ -96,6 +96,15 @@ public class GrievanceDetails { @Expose @Column(name = "callCounter") private Integer callCounter; + + @Expose + @Column(name = "PreferredLanguageId") + private Integer preferredLanguageId; + + @Expose + @Column(name = "PreferredLanguage") + private String preferredLanguage; + @Column(name = "Deleted", insertable = false, updatable = true) private Boolean deleted = false; @@ -151,7 +160,7 @@ public class GrievanceDetails { public GrievanceDetails(Long gwid, Long grievanceId, Long beneficiaryRegID, Long benCallID, Integer providerServiceMapID, String complaintID, String subjectOfComplaint, String complaint, String primaryNumber, String severety, String state, String agentID, String userid, Boolean isAllocated, - Boolean retryNeeded, Boolean isRegistered, Integer callCounter, Boolean deleted, Character processed, + Boolean retryNeeded, Boolean isRegistered, Integer callCounter, Integer preferredLanguageId, String preferredLanguage, Boolean deleted, Character processed, String createdBy, Timestamp createdDate, String modifiedBy, Timestamp lastModDate, Integer vanSerialNo, Integer vanID, String vehicalNo, Integer parkingPlaceID, String syncedBy, Timestamp syncedDate, Boolean isCompleted) { @@ -173,6 +182,8 @@ public GrievanceDetails(Long gwid, Long grievanceId, Long beneficiaryRegID, Long this.retryNeeded = retryNeeded; this.isRegistered = isRegistered; this.callCounter = callCounter; + this.preferredLanguageId = preferredLanguageId; + this.preferredLanguage = preferredLanguage; this.deleted = deleted; this.processed = processed; this.createdBy = createdBy; @@ -324,6 +335,22 @@ public Integer getCallCounter() { public void setCallCounter(Integer callCounter) { this.callCounter = callCounter; } + + public Integer getPreferredLanguageId() { + return preferredLanguageId; + } + + public void setPreferredLanguageId(Integer preferredLanguageId) { + this.preferredLanguageId = preferredLanguageId; + } + + public String getPreferredLanguage() { + return preferredLanguage; + } + + public void setPreferredLanguage(String preferredLanguage) { + this.preferredLanguage = preferredLanguage; + } public Boolean getDeleted() { return deleted; diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index 1c4a609d..40a1b6f4 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -1,14 +1,19 @@ package com.iemr.common.repository.grievance; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; - +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.iemr.common.data.grievance.GrievanceDetails; +import jakarta.transaction.Transactional; + @Repository public interface GrievanceDataRepo extends CrudRepository{ @@ -19,4 +24,21 @@ public interface GrievanceDataRepo extends CrudRepository findGrievancesInDateRangeAndLanguage( + @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate, + @Param("language") String language); + + + @Modifying + @Query("UPDATE GrievanceDetails g SET g.isAllocated = true, g.userid = :userId WHERE g.grievanceid = :grievanceId") + @Transactional + public int allocateGrievance(@Param("grievanceId") Long grievanceId, @Param("userId") Integer userId); + + + @Query(nativeQuery = true, value = "SELECT PreferredLanguageId, PreferredLanguage, VanSerialNo, VanID, ParkingPlaceId, VehicalNo FROM db_identity.i_beneficiarydetails WHERE BeneficiaryRegID = :benRegId") + public ArrayList getBeneficiaryGrievanceDetails(@Param("benRegId") Long benRegId); + } diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java index e13c8387..b5600c7a 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java @@ -219,7 +219,22 @@ public List> dataSyncToGrievance() { grievance.setState(state); } } - + //setting language related properties and other + ArrayList list1 = grievanceDataRepo.getBeneficiaryGrievanceDetails(grievance.getBeneficiaryRegId()); + for (Object[] objects : list1) { + if (objects != null && objects.length >= 6) { + grievance.setPreferredLanguageId((Integer) objects[0]); + grievance.setPreferredLanguage((String) objects[1]); + grievance.setVanSerialNo((Integer) objects[2]); + grievance.setVanId((Integer) objects[3]); + grievance.setParkingPlaceId((Integer) objects[4]); + grievance.setVehicalNo((String) objects[5]); + + } + } + + + // Setting remaining grievance properties (similar to the existing code) grievance.setAgentId(grievance.getAgentId()); grievance.setDeleted(grievance.getDeleted()); diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingService.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingService.java new file mode 100644 index 00000000..19a96723 --- /dev/null +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingService.java @@ -0,0 +1,9 @@ +package com.iemr.common.service.grievance; + +import org.springframework.stereotype.Service; + +@Service +public interface GrievanceHandlingService { + public String allocateGrievances(String request) throws Exception; + +} diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java new file mode 100644 index 00000000..6ade7fc7 --- /dev/null +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -0,0 +1,79 @@ +package com.iemr.common.service.grievance; + +import java.util.Comparator; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Service; + +import com.iemr.common.data.grievance.GrievanceAllocationRequest; +import com.iemr.common.data.grievance.GrievanceDetails; +import com.iemr.common.repository.grievance.GrievanceDataRepo; +import com.iemr.common.utils.mapper.InputMapper; + +@Service +public class GrievanceHandlingServiceImpl implements GrievanceHandlingService { + + + private Logger logger = LoggerFactory.getLogger(GrievanceHandlingServiceImpl.class); + + + private final GrievanceDataRepo grievanceDataRepo; + + @Autowired + public GrievanceHandlingServiceImpl(GrievanceDataRepo grievanceDataRepo) { + this.grievanceDataRepo = grievanceDataRepo; + } + + + @Override + public String allocateGrievances(String request) throws Exception { + // Step 1: Parse the request string into the appropriate GrievanceAllocationRequest object + GrievanceAllocationRequest allocationRequest = InputMapper.gson().fromJson(request, GrievanceAllocationRequest.class); + + // Step 2: Fetch grievances based on the start date, end date range, and language + List grievances = grievanceDataRepo.findGrievancesInDateRangeAndLanguage( + allocationRequest.getStartDate(), allocationRequest.getEndDate(), allocationRequest.getLanguage()); + + if (grievances.isEmpty()) { + throw new Exception("No grievances found in the given date range and language."); + } + + // Step 3: Sort grievances in ascending order based on creation date + grievances.sort(Comparator.comparing(GrievanceDetails::getCreatedDate)); + + // Step 4: Get the allocation parameters from the request + int totalAllocated = 0; + int userIndex = 0; + List userIds = allocationRequest.getUserID(); + int allocateNo = allocationRequest.getAllocateNo(); // Number of grievances to allocate per user + + + for (int i = 0; i < grievances.size(); i++) { + Integer userId = userIds.get(userIndex); + GrievanceDetails grievance = grievances.get(i); + + int rowsAffected = grievanceDataRepo.allocateGrievance(grievance.getGrievanceId(), userId); + if (rowsAffected > 0) { + totalAllocated++; + logger.debug("Allocated grievance ID {} to user ID {}", grievance.getGrievanceId(), userId); + } else { + logger.error("Failed to allocate grievance ID {} to user ID {}", grievance.getGrievanceId(), userId); + } + + // Move to the next user after allocateNo grievances + if ((i + 1) % allocateNo == 0) { + userIndex = (userIndex + 1) % userIds.size(); + } + } + + // Step 6: Return a message with the total number of grievances allocated + return "Successfully allocated " + totalAllocated + " grievances to users."; + } + + +}