diff --git a/README.md b/README.md index 1913f7d..22690e6 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ In `Main`: * Create at least **3 requests** * Use a loop to print them * Print `"HIGH PRIORITY"` if severity ≥ 4 +* --- @@ -139,7 +140,7 @@ Submit: * Screenshot or copy of sample console output * Clean, formatted code ---- +---- # Creative Extension (Optional) diff --git a/src/main/java/org/codedifferently/Main.java b/src/main/java/org/codedifferently/Main.java index 435139b..96b4f75 100644 --- a/src/main/java/org/codedifferently/Main.java +++ b/src/main/java/org/codedifferently/Main.java @@ -1,17 +1,150 @@ package org.codedifferently; -//TIP To Run code, press or -// click the icon in the gutter. +import java.util.ArrayList; +import java.util.Scanner; + public class Main { public static void main(String[] args) { - //TIP Press with your caret at the highlighted text - // to see how IntelliJ IDEA suggests fixing it. - System.out.printf("Hello and welcome!"); - - for (int i = 1; i <= 5; i++) { - //TIP Press to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - System.out.println("i = " + i); + + // Starter requests + MaintenanceRequest request1 = new MaintenanceRequest("Bob", "A1", "Water Leak", 4); + MaintenanceRequest request2 = new MaintenanceRequest("Sam", "B1", "Broken Spring", 1, "NEW"); + MaintenanceRequest request3 = new MaintenanceRequest("Larry", "C1", "Window Repair", 2); + + MaintenanceOffice office = new MaintenanceOffice(); + office.addRequest(request1); + office.addRequest(request2); + office.addRequest(request3); + + Scanner scanner = new Scanner(System.in); + boolean running = true; + + while (running) { + System.out.println("\n--- MAINTENANCE MENU ---"); + System.out.println("1) Create a request"); + System.out.println("2) Assign a tech to an existing request"); + System.out.println("3) Update request status (NEW / IN_PROGRESS / DONE)"); + System.out.println("4) Daily report"); + System.out.println("5) Exit"); + System.out.print("Choose: "); + + String choice = scanner.nextLine().trim(); + + switch (choice) { + case "1": { + // CREATE REQUEST + System.out.print("Enter tenant name (or type 'done' to cancel): "); + String name = scanner.nextLine().trim(); + if (name.equalsIgnoreCase("done")) break; + + System.out.print("Enter apartment number (or type 'done' to cancel): "); + String apt = scanner.nextLine().trim(); + if (apt.equalsIgnoreCase("done")) break; + + System.out.print("Enter issue type (or type 'done' to cancel): "); + String issue = scanner.nextLine().trim(); + if (issue.equalsIgnoreCase("done")) break; + + int severity; + while (true) { + System.out.print("Enter severity (1-5) (or type 'done' to cancel): "); + String sevInput = scanner.nextLine().trim(); + if (sevInput.equalsIgnoreCase("done")) { + severity = -1; + break; + } + try { + severity = Integer.parseInt(sevInput); + if (severity >= 1 && severity <= 5) break; + System.out.println("Severity must be 1-5."); + } catch (NumberFormatException e) { + System.out.println("Invalid number."); + } + } + if (severity == -1) break; + + MaintenanceRequest newReq = new MaintenanceRequest(name, apt, issue, severity); + office.addRequest(newReq); + + // Special actions + assign tech + office.handleSpecialCases(newReq); + String tech = office.assignTech(newReq); + System.out.println("Request received and saved."); + System.out.println("Assigned tech: " + tech); + break; + } + + case "2": { + // ASSIGN TECH TO EXISTING + System.out.print("Enter tenant name (or type 'done' to cancel): "); + String name = scanner.nextLine().trim(); + if (name.equalsIgnoreCase("done")) break; + + System.out.print("Enter apartment number (or type 'done' to cancel): "); + String apt = scanner.nextLine().trim(); + if (apt.equalsIgnoreCase("done")) break; + + MaintenanceRequest found = office.findActiveRequest(name, apt); + if (found == null) { + System.out.println("No ACTIVE request found for " + name + " (Apt " + apt + ")."); + } else { + System.out.println("Found: " + found); + System.out.println("Assigned tech: " + office.assignTech(found)); + } + break; + } + + case "3": { + // UPDATE STATUS + System.out.print("Enter tenant name (or type 'done' to cancel): "); + String name = scanner.nextLine().trim(); + if (name.equalsIgnoreCase("done")) break; + + System.out.print("Enter apartment number (or type 'done' to cancel): "); + String apt = scanner.nextLine().trim(); + if (apt.equalsIgnoreCase("done")) break; + + MaintenanceRequest found = office.findActiveRequest(name, apt); + if (found == null) { + System.out.println("No ACTIVE request found for " + name + " (Apt " + apt + ")."); + break; + } + + System.out.print("Enter new status (NEW / IN_PROGRESS / DONE): "); + String newStatus = scanner.nextLine().trim(); + + boolean updated = office.updateStatus(found, newStatus); + if (!updated) break; + + System.out.println("Updated: " + found); + + // If DONE -> close and move to closed list + if ("DONE".equals(found.getStatus())) { + boolean closed = office.closeRequest(found); + if (closed) { + System.out.println("Request moved to CLOSED list."); + } + } + break; + } + + case "4": { + // DAILY REPORT + office.dailyReport(); + break; + } + + case "5": { + running = false; + System.out.println("Goodbye."); + break; + } + + default: + System.out.println("Invalid choice. Pick 1-5."); + } } + + scanner.close(); } } \ No newline at end of file diff --git a/src/main/java/org/codedifferently/MaintenanceOffice.java b/src/main/java/org/codedifferently/MaintenanceOffice.java new file mode 100644 index 0000000..a2de7c4 --- /dev/null +++ b/src/main/java/org/codedifferently/MaintenanceOffice.java @@ -0,0 +1,148 @@ +package org.codedifferently; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class MaintenanceOffice { + + private final ArrayList activeRequests = new ArrayList<>(); + private final ArrayList closedRequests = new ArrayList<>(); + + public void addRequest(MaintenanceRequest request) { + if (request != null) activeRequests.add(request); + } + + public MaintenanceRequest findActiveRequest(String tenantName, String apartmentNumber) { + if (tenantName == null || apartmentNumber == null) return null; + + for (MaintenanceRequest r : activeRequests) { + if (r.getTenantName().equalsIgnoreCase(tenantName) + && r.getApartmentNumber().equalsIgnoreCase(apartmentNumber)) { + return r; + } + } + return null; + } + + public String assignTech(MaintenanceRequest request) { + int s = request.getSeverity(); + + if (s >= 5) return "Tech A (Emergency)"; + if (s >= 4) return "Tech B (Priority)"; + if (s >= 2) return "Tech C (Standard)"; + return "Tech D (Low)"; + } + + // Special actions for case 1 + public void handleSpecialCases(MaintenanceRequest request) { + if (request == null) return; + + int severity = request.getSeverity(); + String issue = request.getIssueType(); + + if (severity == 5) { + System.out.println("DISPATCH IMMEDIATELY (Severity 5)"); + } + + if (severity >= 4 && issue != null && issue.equalsIgnoreCase("Electrical")) { + System.out.println("WARNING: High severity ELECTRICAL issue."); + } + } + + public boolean updateStatus(MaintenanceRequest request, String newStatus) { + if (request == null || newStatus == null) return false; + + String format = newStatus.trim().toUpperCase(); + + if (!format.equals("NEW") && !format.equals("IN_PROGRESS") && !format.equals("DONE")) { + System.out.println("Invalid status. Allowed: NEW, IN_PROGRESS, DONE"); + return false; + } + + request.setStatus(format); + return true; + } + + public boolean closeRequest(MaintenanceRequest request) { + if (request == null) return false; + + if (!"DONE".equals(request.getStatus())) { + System.out.println("Cannot close request unless status is DONE."); + return false; + } + + // Move from active -> closed + boolean removed = activeRequests.remove(request); + if (!removed) return false; + + request.setStatus("CLOSED"); + closedRequests.add(request); + + System.out.println("Request closed: " + request.getTenantName() + + " (Apt " + request.getApartmentNumber() + ")"); + return true; + } + + public void dailyReport() { + int total = activeRequests.size() + closedRequests.size(); + int open = activeRequests.size(); + int closed = closedRequests.size(); + + int low = 0; // 1-2 + int medium = 0; // 3 + int high = 0; // 4-5 + + Map issueCounts = new HashMap<>(); + + // Count everything (active + closed) + for (MaintenanceRequest r : activeRequests) { + int sev = r.getSeverity(); + if (sev <= 2) low++; + else if (sev == 3) medium++; + else high++; + + //ternary, issue set to either "UNKNOWN" or issue type + String issue = (r.getIssueType() == null) ? "UNKNOWN" : r.getIssueType().trim().toUpperCase(); + issueCounts.put(issue, issueCounts.getOrDefault(issue, 0) + 1); + } + + for (MaintenanceRequest r : closedRequests) { + int sev = r.getSeverity(); + if (sev <= 2) low++; + else if (sev == 3) medium++; + else high++; + //ternary, issue set to either "UNKNOWN" or issue type + String issue = (r.getIssueType() == null) ? "UNKNOWN" : r.getIssueType().trim().toUpperCase(); + issueCounts.put(issue, issueCounts.getOrDefault(issue, 0) + 1); + } + + String mostCommonIssue = "N/A"; + int bestCount = 0; + for (Map.Entry entry : issueCounts.entrySet()) { + if (entry.getValue() > bestCount) { + bestCount = entry.getValue(); + mostCommonIssue = entry.getKey(); + } + } + + int highPriorityActive = 0; + for (MaintenanceRequest r : activeRequests) { + if (r.getSeverity() >= 4) highPriorityActive++; + } + + System.out.println("\n--- DAILY REPORT ---"); + System.out.println("All time Requests): " + total); + System.out.println("Active: " + open); + System.out.println("Closed: " + closed); + System.out.println("Severity frequency:"); + System.out.println(" Low (1-2): " + low); + System.out.println(" Medium (3): " + medium); + System.out.println(" High (4-5): " + high); + System.out.println("Most common issue type: " + mostCommonIssue + " (" + bestCount + ")"); + + if (highPriorityActive > 3) { + System.out.println("OVERLOAD WARNING: High priority ACTIVE requests = " + highPriorityActive); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/codedifferently/MaintenanceRequest.java b/src/main/java/org/codedifferently/MaintenanceRequest.java new file mode 100644 index 0000000..d0e79de --- /dev/null +++ b/src/main/java/org/codedifferently/MaintenanceRequest.java @@ -0,0 +1,43 @@ +package org.codedifferently; + +public class MaintenanceRequest { + private String tenantName; + private String apartmentNumber; + private String issueType; + private int severity; + private String status; // NEW, IN_PROGRESS, DONE, CLOSED + + public MaintenanceRequest(String tenantName, String apartmentNumber, String issueType, int severity) { + this.tenantName = tenantName; + this.apartmentNumber = apartmentNumber; + this.issueType = issueType; + this.severity = severity; + this.status = "NEW"; + } + + public MaintenanceRequest(String tenantName, String apartmentNumber, String issueType, int severity, String status) { + this.tenantName = tenantName; + this.apartmentNumber = apartmentNumber; + this.issueType = issueType; + this.severity = severity; + this.status = (status == null || status.trim().isEmpty()) ? "NEW" : status.trim().toUpperCase(); + } + + public String getTenantName() { return tenantName; } + public String getApartmentNumber() { return apartmentNumber; } + public String getIssueType() { return issueType; } + public int getSeverity() { return severity; } + public String getStatus() { return status; } + + public void setTenantName(String tenantName) { this.tenantName = tenantName; } + public void setApartmentNumber(String apartmentNumber) { this.apartmentNumber = apartmentNumber; } + public void setIssueType(String issueType) { this.issueType = issueType; } + public void setSeverity(int severity) { this.severity = severity; } + public void setStatus(String status) { this.status = status; } + + @Override + public String toString() { + return tenantName + " | Apt " + apartmentNumber + " | " + issueType + + " | Sev " + severity + " | " + status; + } +} \ No newline at end of file