Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ In `Main`:
* Create at least **3 requests**
* Use a loop to print them
* Print `"HIGH PRIORITY"` if severity ≥ 4
*

---

Expand Down Expand Up @@ -139,7 +140,7 @@ Submit:
* Screenshot or copy of sample console output
* Clean, formatted code

---
----

# Creative Extension (Optional)

Expand Down
153 changes: 143 additions & 10 deletions src/main/java/org/codedifferently/Main.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,150 @@
package org.codedifferently;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
//TIP Press <shortcut actionId="ShowIntentionActions"/> 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 <shortcut actionId="Debug"/> to start debugging your code. We have set one <icon src="AllIcons.Debugger.Db_set_breakpoint"/> breakpoint
// for you, but you can always add more by pressing <shortcut actionId="ToggleLineBreakpoint"/>.
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();
}
}
148 changes: 148 additions & 0 deletions src/main/java/org/codedifferently/MaintenanceOffice.java
Original file line number Diff line number Diff line change
@@ -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<MaintenanceRequest> activeRequests = new ArrayList<>();
private final ArrayList<MaintenanceRequest> 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<String, Integer> 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<String, Integer> 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);
}
}
}
43 changes: 43 additions & 0 deletions src/main/java/org/codedifferently/MaintenanceRequest.java
Original file line number Diff line number Diff line change
@@ -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;
}
}