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.

To implement the functionality mentioned above, the following steps can be taken:

1. Create a class named "Account" with the following attributes: username (String), password (String), firstName (String), lastName (String).
2. Implement a constructor in the Account class to initialize the attributes.
3. In the Account class, implement the "checkUserName()" method to check if the username meets the required conditions.
4. In the Account class, implement the "checkPasswordComplexity()" method to check if the password meets the required complexity rules.
5. In the Account class, implement the "registerUser()" method that combines the results of the "checkUserName()" and "checkPasswordComplexity()" methods to return the appropriate registration message.
6. In the Account class, implement the "loginUser()" method to verify the login details entered by the user.
7. In the Account class, implement the "returnLoginStatus()" method to return the appropriate login status message.
8. Create a class named "Task" with the following attributes: taskName (String), taskNumber (int), taskDescription (String), developerDetails (String), taskDuration (double), taskID (String), taskStatus (String).
9. Implement a constructor in the Task class to initialize the attributes.
10. In the Task class, implement the "checkTaskDescription()" method to check if the task description is not more than 50 characters.
11. In the Task class, implement the "createTaskID()" method to generate the taskID based on the task name and developer details.
12. In the Task class, implement the "printTaskDetails()" method to return the full task details of each task.
13. Create a class named "KanbanApp" to handle the application functionality.
14. Implement the functionality to add tasks to the application only if the user has logged in successfully.
15. Display the welcome message and the numeric menu options for the user to choose from.
16. Implement the functionality to show a report (option 2) and display the "Coming Soon" message.
17. Implement the functionality to quit the application (option 3) and exit the loop.
18. Implement the functionality to define the number of tasks to be entered and only allow the user to enter that many tasks.
19. Implement the functionality to validate the task description and display the appropriate error message or success message.
20. Implement the functionality to display the full details of each task after it is entered.
21. Accumulate and display the total number of hours across all tasks.
22. Implement the functionality to populate and use arrays for developers, task names, task IDs, task durations, and task statuses.
23. Implement the functionality to display the developer, task names, and task durations for tasks with the status of "done" using the arrays.
24. Implement the functionality to display the developer and duration of the task with the longest duration using the arrays.
25. Implement the functionality to search for a task using the task name and display the task name, developer, and task status using the arrays.
26. Implement the functionality to search for all tasks assigned to a developer and display the task name and task status using the arrays.
27. Implement the functionality to delete a task using the task name from the arrays.
28. Implement the functionality to display a report that lists the full details of all captured tasks using the arrays.
29. Implement the "returnTotalHours()" method in the Task class to calculate and return the total combined hours of all entered tasks.

By following these steps, the application can be developed with the desired functionality, and the methods can be unit tested to ensure their correctness.

To complete the tasks mentioned above, you will need to perform the following steps:

1. Create an account by entering username, password, first name, and last name:
- Check if the username and password meet the required format using the `checkUserName()` and `checkPasswordComplexity()` methods.
- If the conditions are met, use the `registerUser()` method to register the user and display the appropriate registration message.

2. Login to the account using the same username and password:
- Verify the login details entered using the `loginUser()` method.
- Use the `returnLoginStatus()` method to return the necessary login status message.

3. Implement the Login class with the following methods:
- `checkUserName()`: This method ensures that the username is correctly formatted.
- `checkPasswordComplexity()`: This method ensures that the password meets the required complexity rules.
- `registerUser()`: This method returns the necessary registration messaging indicating if the username and password are correctly formatted.
- `loginUser()`: This method verifies the login details entered by the user.
- `returnLoginStatus()`: This method returns the necessary messaging for a successful or failed login.

4. Add functionality to your application:
- Restrict users from adding tasks unless they have logged in successfully.
- Display the welcome message: "Welcome to EasyKanban."
- Implement a numeric menu for users to choose features:
- Option 1: Add tasks
- Option 2: Show report (display "Coming Soon" message)
- Option 3: Quit
- Run the application until the user selects the quit option.

5. Define the number of tasks the user wants to enter when the application starts:
- Prompt the user to enter the desired number of tasks.
- Allow the user to enter only the specified number of tasks.

6. Enter task details:
- Prompt the user to enter task details for each task, including Task Name, Task Number, Task Description, Developer Details, Task Duration, and Task Status.
- Validate the task description using the `checkTaskDescription()` method.
- Generate a Task ID using the `createTaskID()` method.

7. Display task details:
- After entering each task, display the full task details using JOptionPane. The details should include Task Status, Developer Details, Task Number, Task Name, Task Description, Task ID, and Duration.

8. Accumulate and display total task hours:
- Calculate the total number of hours across all tasks using the `returnTotalHours()` method.
- Display the total hours once all tasks have been entered.

9. Create a Task class with the following methods:
- `checkTaskDescription()`: This method ensures that the task description is not longer than 50 characters.
- `createTaskID()`: This method generates and returns the Task ID.
- `printTaskDetails()`: This method returns the full task details of each task.
- `returnTotalHours()`: This method returns the total combined hours of all entered tasks.

10. Implement additional features:
- Populate arrays: Developer, Task Names, Task ID, Task Duration, and Task Status.
- Display specific information from the arrays based on user requests:
a. Display the Developer, Task Names, and Task Duration for all tasks with the status "done."
b. Display the Developer and Duration of the task with the longest duration.
c. Search for a task by 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.

Remember to write unit tests for each method and automate the tests to ensure the functionality of your application.