- Add serialize/deserialize support for core models
- Add file-based load/save functions in management services
- Introduce FileManager, Config, Utility and helper utilities
- Persist observer IDs for notification services
- Resolve object relationships during load (services, bookings, invoices, job cards)
- Add controller-level loadSystemData/saveSystemData
- Load data at app startup and save on shutdown
<UserStory> NOT001: View Customer Notifications </UserStory>
<Changes>
1. Added shared notification helper functions to display notifications in tabular format, support notification selection, and show full notification details.
2. Implemented notification deletion logic in Controller and UserManagementService to remove notifications for the authenticated user after viewing.
3. Updated CustomerMenu::viewNotifications() to use the shared notification viewing and deletion flow.
</Changes>
<Test>
Precondition:
1. Customer is registered in the system.
2. Customer is logged into the system.
3. Customer has one or more notifications available.
Steps:
1. Navigate to “View Notifications” from the customer menu.
- Verify that the system displays the list of notifications with title and timestamp.
2. Select a notification from the displayed list.
- Verify that the system displays the full notification details including message.
3. View the selected notification and continue.
- Verify that the viewed notification is deleted from the system.
4. Navigate to “View Notifications” again.
- Verify that the previously viewed notification no longer appears in the notification list.
</Test>
<Review>
Sreeja Reghukumar, please review
</Review>
<UserStory> ADM002: Remove Technician or Customer </UserStory>
<Changes>
1. Integrated UserManagementService and ServiceManagementService into Controller for user removal operations.
2. Added Controller::removeUser to validate user existence, cancel related service bookings and technician jobs, and mark user inactive.
3. Updated JobCard and ServiceBooking models to use util::ServiceJobStatus consistently and store technician references as User* instead of strings.
4. Extended util::ServiceJobStatus enum with PENDING and CANCELLED states, including string conversion support.
5. Implemented ServiceManagementService methods to cancel customer service bookings and technician jobs, with inventory restocking and notifications.
6. Enhanced AdminMenu::removeUser to list active users, validate index input, confirm deletion, and invoke Controller::removeUser.
7. Added helper functions in AdminMenu to filter active users and display them with formatted output including user type.
</Changes>
<Test>
Precondition:
1. Admin is logged into the system.
2. Technician accounts exist in the system.
3. Technician has active job assignments.
Steps:
1. Navigate to Admin Menu and select "Remove User".
2. System displays list of active users with IDs, usernames, and user types.
- Verify that inactive users are excluded from the list.
3. Admin selects technician ID for removal.
- Verify that system confirms deletion before proceeding.
4. Technician is removed from job assignment list.
- Verify that associated jobs are cancelled, inventory is restocked, and notifications are sent.
</Test>
<Review>
Sreeja Reghukumar
</Review>
<UserStory> SER001: Assign job to technician </UserStory>
<Changes>
1. Added ServiceManagementService logic to retrieve service bookings and create job cards for assigned technicians.
2. Added UserManagementService support to retrieve technicians by user type and fetch technician details by ID.
3. Connected Controller methods with ServiceManagementService and UserManagementService for service booking retrieval, technician listing, and job card creation.
4. Updated JobCard model to use util::ServiceJobStatus consistently and simplified constructor initialization for assigned and completion timestamps.
5. Added PENDING status in ServiceJobStatus enum for identifying unassigned service bookings.
6. Implemented AdminMenu job assignment flow to list pending service bookings, display available technicians, allow technician selection, and assign jobs for services in the booking.
7. Added notification trigger during job card creation for assigned technicians.
</Changes>
<Test>
Job assignment functionality validation
Precondition:
1. System is running.
2. Pending service bookings are available in the system.
3. Technician users are available in the system.
4. Admin user is logged in and admin menu is active.
Steps:
1. Launch the application and log in as an admin.
2. Select the Assign Job option from the admin menu.
3. View the list of available pending service bookings.
- Verify that pending bookings are displayed.
4. Select a valid service booking.
5. View the list of available technicians.
- Verify that technicians are listed for selection.
6. Select a technician to assign the job.
- Verify that job cards are created for services in the booking.
- Verify that assigned jobs are visible in the technician’s menu.
- Verify that a confirmation message is shown.
- Verify that a confirmation notification is sent to the assigned technician.
</Test>
<Review>
Sreeja Reghukumar, please review
</Review>
<UserStory> CUS001:Login </UserStory>
<Changes>
1. Added login implementation in AuthenticationManagementService to validate username and password from stored user records.
2. Connected Controller::login() with AuthenticationManagementService login logic.
3. Added getAuthenticatedUser() integration in Controller for retrieving the logged-in user.
4. Implemented login flow in UserInterface to collect credentials and validate login.
5. Added role-based menu navigation for Admin, Technician, and Customer after successful login.
6. Added error handling to display "Invalid Username or Password" for failed login attempts.
7. Added required includes and controller member dependency for authentication support.
8. Added a check to create a default admin automatically if no admin exists in the system on startup
</Changes>
<Test>
Login functionality validation
Precondition:
1. System is running.
2. User records are available in the data store.
3. Valid username and password exist for a registered user.
Steps:
1. Launch the application.
2. Select the login option from the main menu.
3. Enter a valid username and password.
- Verify that the entered credentials are validated.
- Verify that access is granted and the correct menu is shown based on user type.
4. Enter an invalid username or password.
- Verify that the message "Invalid Username or Password" is displayed.
</Test>
<Review>
Sreeja Reghukumar, please review
</Review>
<UserStory> CUS004: Register Customer Account </UserStory>
<Changes>
1. Added customer registration flow in UserInterface to collect username, name, email, password, and phone inputs.
2. Added validation for email, password, and phone number before proceeding with registration.
3. Updated Controller::createCustomer() and UserManagementService::createUser() to support customer registration with full user details including name.
4. Added duplicate username validation in UserManagementService using map predicate search.
5. Added user creation and insertion logic in UserManagementService to store newly registered customer records in DataStore.
6. Added observer attachment for newly registered users to inventory(only for admins), payment, and service notification services.
7. Added registration confirmation message display after successful customer creation.
</Changes>
<Test>
Precondition:
1. Application is running and user is on the main login/register menu.
2. DataStore is initialized and available for storing user records.
3. Existing customer records may already be present in the system.
Steps:
1. Select the Register Customer option.
2. Enter valid username, name, email, password, and phone number.
3. Submit the registration request.
- Verify that the system accepts valid inputs and creates the customer account.
4. Attempt registration using an already existing username.
- Verify that the duplicate registration is rejected.
5. Register again with valid unique details.
- Verify that the registration confirmation message is displayed.
6. Re-access application data after registration.
- Verify that the customer data is stored persistently.
</Test>
<Review>
Sreeja Reghukumar, please review
</Review>
<UserStory> CUS005: Update Customer Profile Details </UserStory>
<Changes>
1. Added update profile flow in CustomerMenu to collect new email and phone number inputs.
2. Added validation for updated email and phone number before saving changes.
3. Updated Controller::updateUserDetails() to fetch the authenticated user and delegate profile update to UserManagementService.
4. Added user existence validation in UserManagementService before updating profile details.
5. Added logic in UserManagementService to update stored email and phone details for the selected user.
6. Added profile update confirmation message after successful save.
</Changes>
<Test>
Update Customer Profile Details
Precondition:
1. Application is running and a customer is logged into the system.
2. Customer record exists in DataStore.
3. Customer has existing profile details stored in the system.
Steps:
1. Select the Update Profile Details option.
2. Verify that the current profile details are displayed.
- Verify that the system shows the customer’s existing details.
3. Enter a new valid email address and phone number.
4. Save the updated details.
- Verify that the system accepts the changes and displays a success message.
5. Create or view a future booking using the same customer account.
- Verify that the updated profile details are reflected in future bookings.
</Test>
<Review>
Sreeja Reghukumar, please review
</Review>