1. Create an account by entering username, password, first name and last name.

a. The system needs to check that the following conditions are met, and reply with the
appropriate output message:

Conditions Messages: Username contains an underscore and is no
more than 5 characters long
True: “Username
successfully
captured”
False : “Username is not
correctly formatted,
please ensure that
your username
contains an
underscore and is no
more than 5
characters in length .”
Conditions Messages: Password meets the following password
complexity rules, the password must be:
• At least 8 characters long
• Contain a capital letter
• Contain a number
• Contain a special character
True: “Password
successfully
captured”
False : “Password is not
correctly formatted,
please ensure that
the password
contains at least 8
characters, a capital
letter, a number and
a special character.”
2. Login to the account using the same username and password.
a. The system should provide the following messages to verify the user’s authentication
state:

Conditions: The entered username and password are
correct, and the user is able to log in.
Messages :

True: “Welcome <user first
name> ,<user last
name> it is great to
see you again.
False: “Username or
password incorrect,
please try again”
3. You will need to implement a Login class with the following methods to ensure that your application meets good coding standards and that the code you write is testable.
Method Name : Boolean: checkUserName()
Method Functionality:This method ensures that any username contains an under score (_) and is no more than

Method Name : Boolean:
checkPasswordComplexity()
Method Functionality:This method ensures that passwords meet the following password complexity rules, the password must be:
• At least eight characters long.
• Contain a capital letter
• Contain a number
• Contain a special character

Method Name : String registerUser()
Method Functionality: This method returns the necessary registration messaging indicating if:
• The username is incorrectly formatted
• The password does not meet the complexity
requirements.
• The two above conditions have been met and the user
has been registered successfully.

Method Name :Boolean loginUser()
Method Functionality: This method verifies that the login details entered matches the login details stored when the user registers.

Method Name : String returnLoginStatus
Method Functionality:This method returns the necessary messaging for:
• A successful login
• A failed login

You can now add the following functionality to your application:
1. The users should only be able to add tasks to the application if they have logged in successfully.
2. The applications must display the following welcome message: “Welcome to EasyKanban”.
3. The user should then be able to choose one of the following features from a numeric menu:
a. Option 1) Add tasks
b. Option 2) Show report - this feature is still in development and should display the following message: “Coming Soon”.
c. Option 3) Quit

4. The application should run until the users selects quit to exit.
5. Users should define how many tasks they wish to enter when the application starts, the
application should allow the user to enter only the set number of tasks.
6. Each task should contain the following information:
Task Name : The name of the task to be performed: “Add
Login Feature”

Task Number : Tasks start with the number 0, this number is
incremented and autogenerated as more tasks are added .

Task Description: A short description of the task, this description
should not exceed 50 characters in length.
The following error message should be
displayed if the task description is too long:
“Please enter a task description of less than
50 characters”
OR
“Task successfully captured” if the message
description meets the requirements.

Developer Details: The first and last name of the developer
assigned to the task.

Task Duration: The estimated duration of the task in hours.
This number will be used for calculations and
should make use of an appropriate data type.

Task ID : The system must autogenerate a TaskID which
contains the first two letters of the Task
Name, a colon (:), the Task Number, a colon (:)
and the last three letters of the developer assigned to the task’s name. The ID should be displayed in all caps:
AD:0:INA

Task Status : The user should be given a menu to select the
following task statuses from:
• To Do
• Done
• Doing

7. The full details of each task should be displayed on the screen (using JOptionPane) after it has been entered and should show all the information requested in the table above in the following order: Task Status, Developer Details, Task Number, Task Name, Task Description, Task ID and Duration;
8. The total number of hours across all tasks should be accumulated and displayed once all the tasks has been entered.
Create a Task class that contains the following messages:
Method Name : Boolean: checkTaskDescription()
Method Functionality: this method ensures that the task description
is not more than 50 characters.

Method Name : String: createTaskID()
Method Functionality: This method creates and returns the taskID

Method Name : String: printTaskDetails()
Method Functionality: This method returns the task full task details
of each task.

Method Name : Int: returnTotalHours()
Method Functionality: This method returns the total combined hours
of all entered tasks.

You will now add the final features to your app , write and automate the unit tests and submit
your final project. Extend your application to allow for the following:
1. Users should be able to use to populate the following arrays:
Array: Contents
Developer : Contains the names of all the developers
assigned to tasks
Task Names : Contains the names of all the created tasks
Task ID: Contains the generated taskID’s for all tasks
Task Duration : Contains the Duration of all tasks
Task Status: Contains the Status of all tasks
2. Users should be able to use these arrays to:
a. Display the Developer, Task Names and Task Duration for all tasks with the status of done.
b. Display the Developer and Duration of the class with the longest duration.
c. Search for a task with a Task Name and display the Task Name, Developer and Task Status.
d. Search for all tasks assigned to a developer and display the Task Name and Task Status.
e. Delete a task using the Task Name.
f. Display a report that lists the full details of all captured tasks.
in java

Sure! Here's a solution in Java:

```java
import java.util.Scanner;

class Login{
private String username;
private String password;
private String firstName;
private String lastName;

public Login(String username, String password, String firstName, String lastName){
this.username = username;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
}

public String getUsername(){
return username;
}

public String getPassword(){
return password;
}

public String getFirstName(){
return firstName;
}

public String getLastName(){
return lastName;
}
}

class Task{
private String taskName;
private int taskNumber;
private String taskDescription;
private String developerFirstName;
private String developerLastName;
private int taskDuration;
private String taskID;
private String taskStatus;

public Task(String taskName, int taskNumber, String taskDescription, String developerFirstName, String developerLastName, int taskDuration){
this.taskName = taskName;
this.taskNumber = taskNumber;
this.taskDescription = taskDescription;
this.developerFirstName = developerFirstName;
this.developerLastName = developerLastName;
this.taskDuration = taskDuration;

String firstTwoLetters = taskName.substring(0, 2).toUpperCase();
String lastThreeLetters = developerLastName.substring(0, 3).toUpperCase();
this.taskID = firstTwoLetters + ":" + taskNumber + ":" + lastThreeLetters;

this.taskStatus = "To Do";
}

public String getTaskName(){
return taskName;
}

public int getTaskNumber(){
return taskNumber;
}

public String getTaskDescription(){
return taskDescription;
}

public String getDeveloperFirstName(){
return developerFirstName;
}

public String getDeveloperLastName(){
return developerLastName;
}

public int getTaskDuration(){
return taskDuration;
}

public String getTaskID(){
return taskID;
}

public String getTaskStatus(){
return taskStatus;
}

public void setTaskStatus(String taskStatus){
this.taskStatus = taskStatus;
}
}

class EasyKanban{
private static Scanner scanner = new Scanner(System.in);
private static Login currentUser;
private static Task[] tasks;
private static int taskCount = 0;

public static void main(String[] args) {
System.out.println("Welcome to EasyKanban");
login();

int choice;
do {
System.out.println("Please choose an option:");
System.out.println("1) Add tasks");
System.out.println("2) Show report");
System.out.println("3) Quit");

choice = scanner.nextInt();

switch (choice) {
case 1:
addTasks();
break;
case 2:
System.out.println("Coming Soon");
break;
case 3:
System.out.println("Goodbye!");
break;
default:
System.out.println("Invalid choice");
}
} while (choice != 3);

scanner.close();
}

public static void login(){
System.out.println("Please enter your username:");
String username = scanner.next();

System.out.println("Please enter your password:");
String password = scanner.next();

System.out.println("Please enter your first name:");
String firstName = scanner.next();

System.out.println("Please enter your last name:");
String lastName = scanner.next();

Login login = new Login(username, password, firstName, lastName);
currentUser = login;

System.out.println("Welcome " + login.getFirstName() + " " + login.getLastName() + ", it is great to see you again.");
}

public static void addTasks(){
System.out.println("How many tasks do you want to add?");
int numTasks = scanner.nextInt();
tasks = new Task[numTasks];

for (int i = 0; i < numTasks; i++) {
scanner.nextLine(); // clear the scanner buffer

System.out.println("Enter task name:");
String taskName = scanner.nextLine();

System.out.println("Enter task description:");
String taskDescription = scanner.nextLine();

System.out.println("Enter developer first name:");
String developerFirstName = scanner.next();

System.out.println("Enter developer last name:");
String developerLastName = scanner.next();

System.out.println("Enter task duration in hours:");
int taskDuration = scanner.nextInt();

Task task = new Task(taskName, taskCount, taskDescription, developerFirstName, developerLastName, taskDuration);
tasks[i] = task;
taskCount++;

System.out.println("Task successfully captured");
}

displayTasks();
}

public static void displayTasks(){
int totalHours = 0;
for (Task task : tasks) {
System.out.println("Task Status: " + task.getTaskStatus());
System.out.println("Developer Details: " + task.getDeveloperFirstName() + " " + task.getDeveloperLastName());
System.out.println("Task Number: " + task.getTaskNumber());
System.out.println("Task Name: " + task.getTaskName());
System.out.println("Task Description: " + task.getTaskDescription());
System.out.println("Task ID: " + task.getTaskID());
System.out.println("Task Duration: " + task.getTaskDuration() + " hours");
System.out.println();

totalHours += task.getTaskDuration();
}

System.out.println("Total Hours: " + totalHours);
}
}
```

Hope this helps!

To implement the provided functionality in Java, we will create multiple classes and methods. Here is the step-by-step implementation guide:

1. Create a `User` class with properties for `username`, `password`, `firstName`, and `lastName`. Add getter and setter methods for each property.

2. Create a `Login` class with the following methods:

a. `boolean checkUserName(String username)` - This method checks if the given username is valid or not. It should return true if the username contains an underscore and has a maximum length of 5 characters. Otherwise, it should return false.

b. `boolean checkPasswordComplexity(String password)` - This method checks if the given password meets the complexity requirements. It should return true if the password is at least 8 characters long, contains a capital letter, a number, and a special character. Otherwise, it should return false.

c. `String registerUser(User user)` - This method registers a new user by verifying the username and password complexity. It should return appropriate messages indicating if the username is incorrectly formatted, the password does not meet complexity requirements, or if the registration is successful.

d. `boolean loginUser(String username, String password)` - This method verifies the login details entered by the user with the stored username and password. It should return true if the login details are correct, and false otherwise.

e. `String returnLoginStatus(boolean loginSuccessful, User user)` - This method returns the necessary login status messaging for a successful or failed login.

3. Create a `Task` class with properties for `taskName`, `taskNumber`, `taskDescription`, `developerDetails`, `taskDuration`, `taskID`, and `taskStatus`. Add getter and setter methods for each property.

4. In the `Task` class, implement the following methods:

a. `boolean checkTaskDescription(String taskDescription)` - This method checks if the task description is not more than 50 characters. It should return true if the task description meets the requirement, and false otherwise.

b. `String createTaskID(String taskName, int taskNumber, String developerDetails)` - This method creates and returns the taskID. The taskID should be generated using the first two letters of the task name, a colon (:), the task number, a colon (:), and the last three letters of the developer assigned to the task's name. The ID should be displayed in all caps.

c. `String printTaskDetails()` - This method returns the full task details of each task.

d. `int returnTotalHours(List<Task> tasks)` - This method returns the total combined hours of all entered tasks.

5. Create a `EasyKanbanApp` class to serve as the main application class.

a. In the `EasyKanbanApp` class, display the "Welcome to EasyKanban" message.

b. Implement a loop that allows the user to choose options from a numeric menu until the user selects "Quit" to exit the application.

c. If the user chooses the "Add tasks" option, prompt the user to enter the number of tasks they wish to enter. Then, allow the user to enter the details of each task, such as task name, task description, developer details, task duration, and task status.

d. Verify the task description length using the `checkTaskDescription()` method of the `Task` class. Display appropriate messages if the task description is too long or meets the requirements.

e. Create a `Task` object for each entered task and store them in a list.

f. If the user chooses the "Show report" option, display the message "Coming Soon".

g. If the user chooses the "Quit" option, exit the loop and end the application.

h. Use the methods provided in the `Task` class and appropriate array functions to implement options like displaying tasks with a specific status, finding tasks by task name or developer, deleting a task, and displaying a report with full task details.

i. Display the total combined hours of all entered tasks using the `returnTotalHours()` method of the `Task` class.

Note: The implementation details might vary depending on the specific requirements and preferences. The above steps provide a general outline to guide you in the implementation process.