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