Complix Integration added
This commit is contained in:
@@ -1,19 +1,16 @@
|
||||
package com.rit.whatsapp.handler;
|
||||
|
||||
import com.rit.whatsapp.model.GrievanceDraft;
|
||||
import com.rit.whatsapp.model.UserState;
|
||||
import com.rit.whatsapp.service.FirebaseService;
|
||||
import com.rit.whatsapp.service.SessionService;
|
||||
import com.rit.whatsapp.service.WhatsAppMessageBuilder;
|
||||
import com.rit.whatsapp.service.WhatsAppMessageService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
@Component
|
||||
public class GrievanceHandler {
|
||||
@@ -21,54 +18,270 @@ public class GrievanceHandler {
|
||||
private final WhatsAppMessageService messageService;
|
||||
private final SessionService sessionService;
|
||||
private final StudentMenuHandler studentMenuHandler;
|
||||
private final FirebaseService firebaseService;
|
||||
|
||||
@Autowired
|
||||
public GrievanceHandler(WhatsAppMessageService messageService, SessionService sessionService, @Lazy StudentMenuHandler studentMenuHandler) {
|
||||
public GrievanceHandler(WhatsAppMessageService messageService,
|
||||
SessionService sessionService,
|
||||
@Lazy StudentMenuHandler studentMenuHandler,
|
||||
FirebaseService firebaseService) {
|
||||
this.messageService = messageService;
|
||||
this.sessionService = sessionService;
|
||||
this.studentMenuHandler = studentMenuHandler;
|
||||
this.firebaseService = firebaseService;
|
||||
}
|
||||
|
||||
public void startGrievanceFlow(String phoneNumber) {
|
||||
sessionService.resetState(phoneNumber);
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_ACTION);
|
||||
|
||||
List<Map<String, String>> rows = new ArrayList<>();
|
||||
rows.add(createRow("grv_action_new", "Raise New Grievance", "Submit a new issue"));
|
||||
rows.add(createRow("grv_action_status", "Check Status", "View status of existing grievances"));
|
||||
rows.add(createRow("grv_action_delete", "Delete Grievance", "Cancel and remove an existing grievance"));
|
||||
|
||||
Map<String, Object> listMsg = WhatsAppMessageBuilder.buildListMessage(
|
||||
"Grievance Portal",
|
||||
"Please select an option:",
|
||||
"Select Action",
|
||||
rows
|
||||
);
|
||||
messageService.sendInteractiveMessage(phoneNumber, listMsg);
|
||||
}
|
||||
|
||||
String message = "📢 *RIT Grievance Portal Notice*\n\n" +
|
||||
"Please note that grievances and complaints must be officially registered and tracked using our dedicated mobile application, *Complix-R*.\n\n" +
|
||||
"Kindly download the app from the Google Play Store to submit your ticket:\n" +
|
||||
"🔗 https://play.google.com/store/apps/details?id=com.ritchennai.complixr&pcampaignid=web_share";
|
||||
public void handleActionSelection(String phoneNumber, String actionId) {
|
||||
if ("grv_action_new".equals(actionId)) {
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_TITLE);
|
||||
GrievanceDraft draft = sessionService.getOrCreateGrievanceDraft(phoneNumber);
|
||||
|
||||
String token = sessionService.getImsToken(phoneNumber);
|
||||
if (token != null) {
|
||||
draft.setStudentName(sessionService.getStudentName(phoneNumber, token));
|
||||
draft.setImsId(sessionService.getImsId(phoneNumber));
|
||||
}
|
||||
|
||||
messageService.sendMessage(phoneNumber, message);
|
||||
messageService.sendMessage(phoneNumber, "📝 Please type a short summary/title of the issue you are facing:");
|
||||
} else if ("grv_action_status".equals(actionId)) {
|
||||
String imsId = sessionService.getImsId(phoneNumber);
|
||||
List<Map<String, Object>> grievances = firebaseService.getUserGrievances(imsId);
|
||||
|
||||
if (grievances.isEmpty()) {
|
||||
messageService.sendMessage(phoneNumber, "You have no existing grievances.");
|
||||
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||
return;
|
||||
}
|
||||
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_STATUS_SELECTION);
|
||||
|
||||
Collections.sort(grievances, (a, b) -> {
|
||||
com.google.cloud.Timestamp t1 = (com.google.cloud.Timestamp) a.get("createdAt");
|
||||
com.google.cloud.Timestamp t2 = (com.google.cloud.Timestamp) b.get("createdAt");
|
||||
if (t1 == null || t2 == null) return 0;
|
||||
return t2.compareTo(t1);
|
||||
});
|
||||
|
||||
List<Map<String, String>> rows = new ArrayList<>();
|
||||
int count = 0;
|
||||
for (Map<String, Object> g : grievances) {
|
||||
if (count >= 10) break;
|
||||
String id = (String) g.get("id");
|
||||
String title = (String) g.get("title");
|
||||
String status = (String) g.get("status");
|
||||
String displayTitle = title != null && title.length() > 24 ? title.substring(0, 21) + "..." : title;
|
||||
rows.add(createRow("grv_status_" + id, displayTitle, "Status: " + status));
|
||||
count++;
|
||||
}
|
||||
|
||||
Map<String, Object> listMsg = WhatsAppMessageBuilder.buildListMessage(
|
||||
"Your Grievances",
|
||||
"Select a grievance to see details:",
|
||||
"Select Grievance",
|
||||
rows
|
||||
);
|
||||
messageService.sendInteractiveMessage(phoneNumber, listMsg);
|
||||
} else if ("grv_action_delete".equals(actionId)) {
|
||||
String imsId = sessionService.getImsId(phoneNumber);
|
||||
List<Map<String, Object>> grievances = firebaseService.getUserGrievances(imsId);
|
||||
|
||||
if (grievances.isEmpty()) {
|
||||
messageService.sendMessage(phoneNumber, "You have no grievances to delete.");
|
||||
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||
return;
|
||||
}
|
||||
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_DELETE_SELECTION);
|
||||
|
||||
Collections.sort(grievances, (a, b) -> {
|
||||
com.google.cloud.Timestamp t1 = (com.google.cloud.Timestamp) a.get("createdAt");
|
||||
com.google.cloud.Timestamp t2 = (com.google.cloud.Timestamp) b.get("createdAt");
|
||||
if (t1 == null || t2 == null) return 0;
|
||||
return t2.compareTo(t1);
|
||||
});
|
||||
|
||||
List<Map<String, String>> rows = new ArrayList<>();
|
||||
int count = 0;
|
||||
for (Map<String, Object> g : grievances) {
|
||||
if (count >= 10) break;
|
||||
String id = (String) g.get("id");
|
||||
String title = (String) g.get("title");
|
||||
String displayTitle = title != null && title.length() > 24 ? title.substring(0, 21) + "..." : title;
|
||||
rows.add(createRow("grv_delete_" + id, displayTitle, "Select to delete"));
|
||||
count++;
|
||||
}
|
||||
|
||||
Map<String, Object> listMsg = WhatsAppMessageBuilder.buildListMessage(
|
||||
"Delete Grievance",
|
||||
"Select the grievance you want to delete:",
|
||||
"Select Grievance",
|
||||
rows
|
||||
);
|
||||
messageService.sendInteractiveMessage(phoneNumber, listMsg);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleStatusSelection(String phoneNumber, String selectionId) {
|
||||
String id = selectionId.replace("grv_status_", "");
|
||||
String imsId = sessionService.getImsId(phoneNumber);
|
||||
List<Map<String, Object>> grievances = firebaseService.getUserGrievances(imsId);
|
||||
|
||||
Map<String, Object> selected = null;
|
||||
for (Map<String, Object> g : grievances) {
|
||||
if (id.equals(g.get("id"))) {
|
||||
selected = g;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (selected != null) {
|
||||
String msg = "🎫 *Ticket Details*\n\n" +
|
||||
"📁 *Title:* " + selected.get("title") + "\n" +
|
||||
"🏢 *Department:* " + selected.get("department") + "\n" +
|
||||
"📝 *Description:* " + selected.get("description") + "\n" +
|
||||
"📊 *Status:* " + selected.get("status");
|
||||
messageService.sendMessage(phoneNumber, msg);
|
||||
} else {
|
||||
messageService.sendMessage(phoneNumber, "Grievance not found.");
|
||||
}
|
||||
|
||||
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||
}
|
||||
|
||||
public void handleCategorySelection(String phoneNumber, String selectedCategory) {
|
||||
public void handleDeleteSelection(String phoneNumber, String selectionId) {
|
||||
String id = selectionId.replace("grv_delete_", "");
|
||||
firebaseService.deleteGrievance(id);
|
||||
messageService.sendMessage(phoneNumber, "✅ Grievance ticket *" + id + "* has been successfully deleted along with any uploaded attachments.");
|
||||
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||
}
|
||||
|
||||
public void handleTitleInput(String phoneNumber, String title) {
|
||||
GrievanceDraft draft = sessionService.getOrCreateGrievanceDraft(phoneNumber);
|
||||
draft.setTitle(title);
|
||||
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_DEPT);
|
||||
|
||||
List<String> deps = firebaseService.getDepartments("RIT");
|
||||
List<Map<String, String>> deptRows = new ArrayList<>();
|
||||
|
||||
if (deps.isEmpty()) {
|
||||
deptRows.add(createRow("grv_dept_CSE", "CSE", "Computer Science"));
|
||||
deptRows.add(createRow("grv_dept_Admin", "Admin", "Admin Office"));
|
||||
} else {
|
||||
for (String dep : deps) {
|
||||
if (deptRows.size() >= 10) break;
|
||||
String displayTitle = dep != null && dep.length() > 24 ? dep.substring(0, 21) + "..." : dep;
|
||||
deptRows.add(createRow("grv_dept_" + dep, displayTitle, "Department"));
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Object> listMsg = WhatsAppMessageBuilder.buildListMessage(
|
||||
"Department Selection",
|
||||
"Issue: *" + title + "*\n\nPlease select the concerned department:",
|
||||
"Select Dept",
|
||||
deptRows
|
||||
);
|
||||
messageService.sendInteractiveMessage(phoneNumber, listMsg);
|
||||
}
|
||||
|
||||
public void handleDepartmentSelection(String phoneNumber, String deptId) {
|
||||
String deptName = deptId.replace("grv_dept_", "");
|
||||
GrievanceDraft draft = sessionService.getOrCreateGrievanceDraft(phoneNumber);
|
||||
draft.setDepartment(deptName);
|
||||
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_DESC);
|
||||
messageService.sendMessage(phoneNumber, "You selected " + selectedCategory + ". Please type a brief description of your issue:");
|
||||
messageService.sendMessage(phoneNumber,
|
||||
"Issue: *" + draft.getTitle() + "*\n" +
|
||||
"Department: *" + deptName + "*\n\n" +
|
||||
"📝 Please type a detailed description of your grievance:");
|
||||
}
|
||||
|
||||
public void handleGrievanceDescription(String phoneNumber, String description) {
|
||||
// Generate a mock ticket ID
|
||||
String ticketId = "TKT-" + UUID.randomUUID().toString().substring(0, 6).toUpperCase();
|
||||
|
||||
String confirmationMessage = "Thank you. Your grievance has been recorded.\n\n" +
|
||||
"Ticket ID: *" + ticketId + "*\n" +
|
||||
"Department Notified: Yes\n" +
|
||||
"Status: Open\n\n" +
|
||||
"You can check the status of this ticket anytime using the main menu.";
|
||||
public void handleDescriptionInput(String phoneNumber, String description) {
|
||||
GrievanceDraft draft = sessionService.getOrCreateGrievanceDraft(phoneNumber);
|
||||
draft.setDescription(description);
|
||||
|
||||
messageService.sendMessage(phoneNumber, confirmationMessage);
|
||||
|
||||
// Reset state back to main menu
|
||||
sessionService.resetState(phoneNumber);
|
||||
|
||||
// Display student menu
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_IMAGE);
|
||||
|
||||
List<Map<String, String>> buttons = new ArrayList<>();
|
||||
Map<String, String> skipBtn = new HashMap<>();
|
||||
skipBtn.put("id", "grv_skip_image");
|
||||
skipBtn.put("title", "Skip Image");
|
||||
buttons.add(skipBtn);
|
||||
|
||||
Map<String, Object> buttonMsg = WhatsAppMessageBuilder.buildButtonMessage(
|
||||
"📸 (Optional) Please send a photo attachment as supporting evidence for your grievance.\n\n" +
|
||||
"Or click the button below to submit without an image.",
|
||||
buttons
|
||||
);
|
||||
messageService.sendInteractiveMessage(phoneNumber, buttonMsg);
|
||||
}
|
||||
|
||||
public void handleImageInput(String phoneNumber, String mediaId, String mimeType) {
|
||||
GrievanceDraft draft = sessionService.getOrCreateGrievanceDraft(phoneNumber);
|
||||
String ticketId = generateTicketId();
|
||||
draft.setTicketId(ticketId);
|
||||
|
||||
messageService.sendMessage(phoneNumber, "Uploading image attachment... ⏳");
|
||||
|
||||
byte[] mediaBytes = messageService.downloadMedia(mediaId);
|
||||
if (mediaBytes != null) {
|
||||
String imageUrl = firebaseService.uploadImage(mediaBytes, mimeType, ticketId);
|
||||
draft.setImageUrl(imageUrl);
|
||||
}
|
||||
|
||||
finalizeAndSaveGrievance(phoneNumber, draft);
|
||||
}
|
||||
|
||||
public void handleSkipImage(String phoneNumber) {
|
||||
GrievanceDraft draft = sessionService.getOrCreateGrievanceDraft(phoneNumber);
|
||||
draft.setTicketId(generateTicketId());
|
||||
finalizeAndSaveGrievance(phoneNumber, draft);
|
||||
}
|
||||
|
||||
private void finalizeAndSaveGrievance(String phoneNumber, GrievanceDraft draft) {
|
||||
firebaseService.saveGrievance(draft);
|
||||
|
||||
String confirmationMsg = "✅ *Grievance Submitted Successfully!*\n\n" +
|
||||
"🎫 *Ticket ID:* `" + draft.getTicketId() + "`\n" +
|
||||
"📁 *Title:* " + draft.getTitle() + "\n" +
|
||||
"🏢 *Department:* " + draft.getDepartment() + "\n" +
|
||||
"📝 *Description:* " + draft.getDescription() + "\n" +
|
||||
(draft.getImageUrl() != null ? "🖼️ *Attachment:* Uploaded\n" : "") +
|
||||
"📊 *Status:* pending\n\n" +
|
||||
"Our administration team will review your ticket shortly.";
|
||||
|
||||
messageService.sendMessage(phoneNumber, confirmationMsg);
|
||||
|
||||
sessionService.clearGrievanceDraft(phoneNumber);
|
||||
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||
}
|
||||
|
||||
private Map<String, String> createButton(String id, String title) {
|
||||
Map<String, String> btn = new HashMap<>();
|
||||
btn.put("id", id);
|
||||
btn.put("title", title);
|
||||
return btn;
|
||||
private String generateTicketId() {
|
||||
return "TKT-" + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
|
||||
}
|
||||
|
||||
private Map<String, String> createRow(String id, String title, String description) {
|
||||
Map<String, String> row = new HashMap<>();
|
||||
row.put("id", id);
|
||||
row.put("title", title);
|
||||
row.put("description", description);
|
||||
return row;
|
||||
}
|
||||
}
|
||||
|
||||
0
src/main/java/com/rit/whatsapp/handler/sedxyTiNX
Normal file
0
src/main/java/com/rit/whatsapp/handler/sedxyTiNX
Normal file
Reference in New Issue
Block a user