From df769a7528bd0e4dee2ad7a4f4b0c549e2270dd1 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 20:04:25 +0530 Subject: [PATCH 01/15] Implement Logout functionality ADM004: Logout 1. Added AuthenticationManagementService::logout to clear authenticated user session. 2. Integrated logout handling in Controller::logout to delegate session termination. 3. Updated AdminMenu::logout and TechnicianMenu::logout to call Controller::logout for consistent session management. 4. Extended TechnicianMenu.h with logout method declaration. 5. Ensured session termination returns control to main menu after logout. Precondition: 1. User is logged into the system (Admin or Technician). 2. AuthenticationManagementService maintains active session. 3. Controller is connected to AuthenticationManagementService. Steps: 1. Navigate to Admin or Technician Menu. 2. Select "Logout" option. - Verify that AuthenticationManagementService::logout clears authenticated user. 3. Session is terminated. - Verify that system confirms logout and invalidates session. 4. Console returns to main menu. - Verify that user is redirected to main menu and must log in again to continue. Sreeja Reghukumar --- .../Trenser.VehicleServiceSystem/controllers/Controller.cpp | 1 + .../Trenser.VehicleServiceSystem/controllers/Controller.h | 3 +++ .../services/AuthenticationManagementService.cpp | 5 +++++ .../Trenser.VehicleServiceSystem/views/AdminMenu.cpp | 1 + .../Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp | 5 +++++ .../Trenser.VehicleServiceSystem/views/TechnicianMenu.h | 1 + 6 files changed, 16 insertions(+) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..06fe460 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -7,6 +7,7 @@ bool Controller::login(const std::string& username, const std::string& password) void Controller::logout() { + m_authenticationManagementService.logout(); } void Controller::changePassword(const std::string& newPassword) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..80eefdc 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "AuthenticationManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + AuthenticationManagementService m_authenticationManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp index ca07fee..cf79ab5 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp @@ -1,3 +1,8 @@ #include "AuthenticationManagementService.h" User* AuthenticationManagementService::m_authenticatedUser = nullptr; + +void AuthenticationManagementService::logout() +{ + m_authenticatedUser = nullptr; +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..d61c12f 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -34,6 +34,7 @@ bool AdminMenu::handleOperation(int choice) void AdminMenu::logout() { + m_controller.logout(); } void AdminMenu::changePassword() diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp index d6c4d57..e087cb4 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp @@ -38,3 +38,8 @@ void TechnicianMenu::completeJob() void TechnicianMenu::viewNotifications() { } + +void TechnicianMenu::logout() +{ + m_controller.logout(); +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h index c366d9b..53449af 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h @@ -10,4 +10,5 @@ public: void showMenu(); void completeJob(); void viewNotifications(); + void logout(); }; From 454af1b4eff074804299fd0c88082349ebf428f8 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Thu, 21 May 2026 10:46:23 +0530 Subject: [PATCH 02/15] Implement Admin and Technician Menus Changes: - Added Admin Menu display with menu options - Added Technician Menu display with menu options - Added menu choice handling using switch case - Connected menu options to corresponding functions - Added invalid choice message - Added logout handling - Added missing function declarations in TechnicianMenu header --- .../views/AdminMenu.cpp | 104 ++++++++++++++---- .../views/TechnicianMenu.cpp | 64 +++++++---- .../views/TechnicianMenu.h | 2 + 3 files changed, 128 insertions(+), 42 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..eb314f6 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -4,31 +4,93 @@ void AdminMenu::showMenu() { - bool isMenuActive = true; - while (isMenuActive) - { - try - { - int choice; - util::clear(); - std::cout << "" << std::endl; - util::read(choice); - if (!handleOperation(choice)) - { - isMenuActive = false; - } - } - catch (const std::exception& e) - { - std::cout << "Exception: " << e.what() << std::endl; - util::pressEnter(); - } - } + while (true) + { + try + { + int choice; + util::clear(); + std::cout << "Admin Menu" + << "\n1. View Stock Levels" + << "\n2. Add Inventory Item" + << "\n3. Remove Inventory Item" + << "\n4. Check Stock Availability" + << "\n5. Assign Job to Technician" + << "\n6. Add Technician" + << "\n7. Remove Customer/Technician" + << "\n8. Create Service" + << "\n9. Remove Service" + << "\n10. Create Combo Package" + << "\n11. Remove Combo Package" + << "\n12. View Notifications" + << "\n13. Change Password" + << "\n14. Logout" + << "\nEnter a choice: "; + util::read(choice); + if (!handleOperation(choice)) + { + break; + } + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + util::pressEnter(); + } + } } bool AdminMenu::handleOperation(int choice) { - return false; + switch (choice) + { + case 1: + viewStockLevels(); + break; + case 2: + addInventoryItem(); + break; + case 3: + removeInventoryItem(); + break; + case 4: + checkStockAvailability(); + break; + case 5: + assignJob(); + break; + case 6: + addTechnician(); + break; + case 7: + removeUser(); + break; + case 8: + createService(); + break; + case 9: + removeService(); + break; + case 10: + createComboPackages(); + break; + case 11: + removeComboPackage(); + break; + case 12: + viewNotifications(); + break; + case 13: + changePassword(); + break; + case 14: + logout(); + return false; + default: + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); + } + return true; } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp index d6c4d57..49de96e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp @@ -4,31 +4,53 @@ void TechnicianMenu::showMenu() { - bool isMenuActive = true; - while (isMenuActive) - { - try - { - int choice; - util::clear(); - std::cout << "" << std::endl; - util::read(choice); - if (!handleOperation(choice)) - { - isMenuActive = false; - } - } - catch (const std::exception& e) - { - std::cout << "Exception: " << e.what() << std::endl; - util::pressEnter(); - } - } + while (true) + { + try + { + int choice; + util::clear(); + std::cout << "Technician Menu" + << "\n1. Mark Job as Completed" + << "\n2. View Notifications" + << "\n3. Change Password" + << "\n4. Logout" + << "\nEnter a choice: "; + util::read(choice); + if (!handleOperation(choice)) + { + break; + } + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + util::pressEnter(); + } + } } bool TechnicianMenu::handleOperation(int choice) { - return false; + switch (choice) + { + case 1: + completeJob(); + break; + case 2: + viewNotifications(); + break; + case 3: + changePassword(); + break; + case 4: + logout(); + return false; + default: + std::cout << "Enter a valid choice!" << std::endl; + util::pressEnter(); + } + return true; } void TechnicianMenu::completeJob() diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h index c366d9b..7f7b8ea 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h @@ -10,4 +10,6 @@ public: void showMenu(); void completeJob(); void viewNotifications(); + void changePassword(); + void logout(); }; From ab6eed5ee678181aeceed78b190e9f1855b9299e Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Thu, 21 May 2026 12:44:00 +0530 Subject: [PATCH 03/15] Implement Remove Combo Package for admin SER003: Remove Combo Package Added integration between Controller and ServiceManagementService to support combo package removal. Implemented ServiceManagementService::removeComboPackage with validation for package ID and marking state as INACTIVE. Enhanced AdminMenu with displayComboPackagesWithIndex helper to show packages in tabular format with index. Updated AdminMenu::selectComboPackage to allow selection of active packages only and return selected package ID. Updated AdminMenu::removeComboPackage to prompt for selection, confirm removal, and provide success/failure feedback. Acceptance Criteria: Admin selects package ID. System confirms deletion. Package removed from customer menu. Precondition: Admin is logged into the system. At least one active combo package exists. Datastore is available for storing combo packages. Steps: Navigate to Admin menu and choose "Remove Combo Package". Verify that the system displays available active packages in tabular format with index. Select a package ID from the list. Verify that inactive packages are skipped and only active ones are selectable. Confirm removal. Verify that the package is marked INACTIVE and removed from customer menu. Check customer view. Verify that the removed package is no longer visible to customers. Sreeja Reghukumar, please review --- .../controllers/Controller.cpp | 14 +++- .../controllers/Controller.h | 5 +- .../services/ServiceManagementService.cpp | 27 +++++++ .../views/AdminMenu.cpp | 80 +++++++++++++++++++ 4 files changed, 124 insertions(+), 2 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..174f4c2 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -1,4 +1,5 @@ #include "Controller.h" +#include "ComboPackage.h" bool Controller::login(const std::string& username, const std::string& password) { @@ -37,7 +38,17 @@ util::Map Controller::getServices() util::Map Controller::getComboPackages() { - return util::Map(); + util::Map currentAvailableComboPackages = m_serviceManagementService.getComboPackages(); + util::Map readOnlyComboPackages; + for (int iterator = 0; iterator < currentAvailableComboPackages.getSize(); iterator++) + { + ComboPackage* currentComboPackage = currentAvailableComboPackages.getValueAt(iterator); + if (currentComboPackage) + { + readOnlyComboPackages.insert(currentComboPackage->getId(), currentComboPackage); + } + } + return readOnlyComboPackages; } void Controller::purchaseService(const util::Vector& serviceIDs, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel) @@ -117,6 +128,7 @@ void Controller::createComboPackage(const std::string& name, const util::Vector< void Controller::removeComboPackage(const std::string& comboPackageID) { + m_serviceManagementService.removeComboPackage(comboPackageID); } util::Map Controller::getInvoicesByUser() diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..e3cfd3e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -1,7 +1,8 @@ #pragma once -#include "Map.h" #include +#include "Map.h" #include "Enums.h" +#include "ServiceManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + ServiceManagementService m_serviceManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 156c12b..b744b2b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -1 +1,28 @@ #include "ServiceManagementService.h" +#include "ComboPackage.h" +#include "Enums.h" + +util::Map ServiceManagementService::getComboPackages() +{ + return m_dataStore.getComboPackages(); +} + +void ServiceManagementService::removeComboPackage(const std::string& comboPackageID) +{ + bool removed = false; + util::Map& currentComboPackages = m_dataStore.getComboPackages(); + for (int iterator = 0; iterator < currentComboPackages.getSize(); iterator++) + { + ComboPackage* currentComboPackage = currentComboPackages.getValueAt(iterator); + if (currentComboPackage && currentComboPackage->getId() == comboPackageID) + { + currentComboPackage->setState(util::State::INACTIVE); + removed = true; + break; + } + } + if (!removed) + { + throw std::runtime_error("Combo package with ID '" + comboPackageID + "' not found."); + } +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..3cd0724 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,10 @@ +#include +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "ComboPackage.h" +#include "Enums.h" void AdminMenu::showMenu() { @@ -80,8 +84,84 @@ void AdminMenu::createComboPackages() { } +static void displayComboPackagesWithIndex(util::Map& currentComboPackageIndexMap) +{ + for (int iterator = 0; iterator < currentComboPackageIndexMap.getSize(); iterator++) + { + const ComboPackage* currentComboPackage = currentComboPackageIndexMap.getValueAt(iterator); + if (currentComboPackage == nullptr) + { + throw std::runtime_error("Error accessing the combopackage.\n"); + } + if (iterator == 0) + { + std::cout << std::left + << std::setw(8) << "Index" + << std::setw(10) << "ID" + << std::setw(20) << "Package Name" + << std::setw(15) << "Discount (%)" + << "\n"; + } + std::cout << std::left + << std::setw(8) << currentComboPackageIndexMap.getKeyAt(iterator) + << std::setw(10) << currentComboPackage->getId() + << std::setw(20) << currentComboPackage->getPackageName() + << std::setw(15) << currentComboPackage->getDiscountPercentage() + << "\n"; + } +} + +static std::string selectComboPackage(util::Map& currentComboPackages) +{ + util::Map currentComboPackageIndexMap; + if (currentComboPackages.getSize() == 0) + { + throw std::runtime_error("No combo packages are available.\n"); + } + int currentIndex = 1, choice, selectedIndex; + for (int iterator = 0; iterator < currentComboPackages.getSize(); iterator++) + { + if (currentComboPackages.getValueAt(iterator)->getState() == util::State::INACTIVE) + { + continue; + } + currentComboPackageIndexMap.insert(currentIndex++, currentComboPackages.getValueAt(iterator)); + } + if (currentComboPackageIndexMap.getSize() == 0) + { + throw std::runtime_error("No combo packages currently active."); + } + displayComboPackagesWithIndex(currentComboPackageIndexMap); + std::cout << "Enter your choice(Index): "; + util::read(choice); + selectedIndex = currentComboPackageIndexMap.find(choice); + if (selectedIndex != -1) + { + std::string selectedComboPackageID = currentComboPackageIndexMap.getValueAt(selectedIndex)->getId(); + return selectedComboPackageID; + } + else + { + std::cout << "Enter a valid choice.\n"; + return ""; + } +} + void AdminMenu::removeComboPackage() { + util::clear(); + util::Map currentComboPackages = m_controller.getComboPackages(); + std::string selectedComboPackageID = selectComboPackage(currentComboPackages); + if (selectedComboPackageID != "") + { + m_controller.removeComboPackage(selectedComboPackageID); + std::cout << "Combo Package removed successfully.\n"; + } + else + { + std::cout << "Combo package removal failed.\n"; + } + util::pressEnter(); } void AdminMenu::viewNotifications() From a6e19017ca048e7495eea9826ecd3d509d98a73a Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Thu, 21 May 2026 13:08:24 +0530 Subject: [PATCH 04/15] Implement Create Combo Package Functionality ADM006:Create Combo Package 1. Added ServiceManagementService::createComboPackage to validate package name, included services, and discount percentage before creation. 2. Integrated Controller::createComboPackage to delegate combo package creation to ServiceManagementService. 3. Enhanced AdminMenu::createComboPackages to allow admin input for package name, service selection, and discount percentage. 4. Implemented service validation to ensure only active services are selectable and that duplicate combos are prevented. 5. Added formatted output for service listing with cost calculation and confirmation messages upon successful package creation. Precondition: 1. Admin is logged into the system. 2. At least two active services exist in the system. 3. ServiceManagementService is connected to DataStore for services and combo packages. Steps: 1. Navigate to Admin Menu and select "Create Combo Package". 2. Enter package name, select two active services, and provide discount percentage. - Verify that system validates service IDs and ensures discount is between 0 and 100. 3. Attempt to create a package with invalid service IDs or duplicate services. - Verify that system rejects with appropriate error messages. 4. Enter valid package details. - Verify that combo package is saved successfully and visible to customers. Sreeja Reghukumar --- .../Trenser.VehicleServiceSystem.vcxproj | 1 + ...enser.VehicleServiceSystem.vcxproj.filters | 3 + .../controllers/Controller.cpp | 1 + .../controllers/Controller.h | 3 + .../services/ServiceManagementService.cpp | 63 +++++++++++++++ .../services/ServiceManagementService.h | 2 +- .../utilities/Utility.h | 15 ++++ .../views/AdminMenu.cpp | 77 +++++++++++++++++++ 8 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj index a65c46d..819264c 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj @@ -176,6 +176,7 @@ + diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters index 77d0509..7c17f4e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters @@ -233,5 +233,8 @@ Header Files\Models + + Header Files\Utilities + \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..5092919 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -113,6 +113,7 @@ void Controller::removeUser(const std::string& userID) void Controller::createComboPackage(const std::string& name, const util::Vector& serviceIDs, double discountPercentage) { + m_serviceManagementService.createComboPackage(name, serviceIDs, discountPercentage); } void Controller::removeComboPackage(const std::string& comboPackageID) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..8512598 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "ServiceManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + ServiceManagementService m_serviceManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 156c12b..097758b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -1 +1,64 @@ #include "ServiceManagementService.h" +#include "Factory.h" +#include "ComboPackage.h" + +void ServiceManagementService::createComboPackage(const std::string& packageName, const util::Vector& serviceIDsInNewCombo, double discountPercentage) +{ + if (packageName.empty()) + { + throw std::invalid_argument("The Combo Package Name cannot be empty.\n"); + } + if (serviceIDsInNewCombo.getSize() < 2 || serviceIDsInNewCombo.getSize() > 2) + { + throw std::invalid_argument("Combo package must contain only two services."); + } + if (discountPercentage < 0.0 || discountPercentage > 100.0) + { + throw std::invalid_argument("Discount percentage must be between 0 and 100."); + } + auto& servicesMap = m_dataStore.getServices(); + for (int index = 0; index < serviceIDsInNewCombo.getSize(); index++) + { + const std::string serviceid = serviceIDsInNewCombo[index]; + if (servicesMap.find(serviceid) == -1) + { + throw std::runtime_error("Service ID not found: " + serviceid); + } + } + auto& comboPackageMap = m_dataStore.getComboPackages(); + for (int iterator = 0; iterator < comboPackageMap.getSize(); iterator++) + { + ComboPackage* existingCombos = comboPackageMap.getValueAt(iterator); + const util::Map& servicesInsideExistingCombos = existingCombos->getServices(); + if (servicesInsideExistingCombos.getSize() == serviceIDsInNewCombo.getSize()) + { + bool isIdentical = true; + for (int serviceIterator = 0; serviceIterator < serviceIDsInNewCombo.getSize(); serviceIterator++) + { + const std::string& id = serviceIDsInNewCombo[serviceIterator]; + if (servicesInsideExistingCombos.find(id) == -1) + { + isIdentical = false; + break; + } + } + if (isIdentical) + { + throw std::runtime_error("A combo package with the same services already exists."); + } + } + } + util::Map selectedServices; + for (int iteratorOne = 0; iteratorOne < serviceIDsInNewCombo.getSize(); iteratorOne++) + { + const std::string& serviceId = serviceIDsInNewCombo[iteratorOne]; + int serviceIndex = servicesMap.find(serviceId); + if (serviceIndex == -1) + { + throw std::runtime_error("Service ID not found: " + serviceId); + } + selectedServices.insert(serviceId, servicesMap.getValueAt(serviceIndex)); + } + ComboPackage* newComboPackage = Factory::getObject(packageName, discountPercentage, selectedServices); + comboPackageMap.insert(newComboPackage->getId(), newComboPackage); +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h index 85e05ed..6c8467e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h @@ -29,7 +29,7 @@ public: void completeJob(const std::string& jobID); void cancelCustomerServiceBookings(const std::string& customerID); void cancelTechnicianJobs(const std::string& technicianID); - void createComboPackage(const std::string& name, const util::Vector& serviceIDs, double discountPercentage); + void createComboPackage(const std::string& packageName, const util::Vector& serviceIDs, double discountPercentage); void removeComboPackage(const std::string& comboPackageID); void sendNotification(User* user, const std::string& title, const std::string& message) override; void attach(User* user) override; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h new file mode 100644 index 0000000..0450c75 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h @@ -0,0 +1,15 @@ +#pragma once +#include "Service.h" +#include "InventoryItem.h" + +inline double calculatePartsCost(const Service* service) +{ + double cost = 0; + auto& requiredInventoryItems = service->getRequiredInventoryItems(); + int requiredInventoryItemsSize = requiredInventoryItems.getSize(); + for (int index = 0; index < requiredInventoryItemsSize; index++) + { + cost += requiredInventoryItems.getValueAt(index)->getPrice(); + } + return cost; +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..f61693a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,9 @@ +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "Service.h" +#include "Utility.h" void AdminMenu::showMenu() { @@ -76,8 +79,82 @@ void AdminMenu::removeUser() { } +static const Service* selectServiceFromServices(const util::Map& services) +{ + util::Map activeServicesMap; + int currentIndex = 1; + int userInputIndex; + std::cout << std::left + << std::setw(10) << "Index" + << std::setw(15) << "Service ID" + << std::setw(25) << "Service Name" + << std::setw(15) << "Estimated Cost" + << std::endl; + for (int index = 0; index < services.getSize(); index++) + { + const Service* currentService = services.getValueAt(index); + if (currentService->getState() != util::State::ACTIVE) + { + continue; + } + activeServicesMap.insert(currentIndex, currentService); + double partsCost = calculatePartsCost(currentService); + std::cout << std::left + << std::setw(10) << currentIndex + << std::setw(15) << currentService->getId() + << std::setw(25) << currentService->getName() + << std::setw(15) << (currentService->getLaborCost() + partsCost) + << std::endl; + currentIndex++; + } + if (activeServicesMap.getSize() == 0) + { + std::cout << "No active services available." << std::endl; + return nullptr; + } + std::cout << "Enter service index: "; + util::read(userInputIndex); + if (activeServicesMap.find(userInputIndex) == -1) + { + std::cout << "Invalid service index." << std::endl; + return nullptr; + } + return activeServicesMap[userInputIndex]; +} + void AdminMenu::createComboPackages() { + util::clear(); + auto serviceList = m_controller.getServices(); + const int numberOfServicesInPackage = 2; + util::Vector selectedServiceID; + for (int iterator = 0; iterator < numberOfServicesInPackage; iterator++) + { + const Service* chosenService = selectServiceFromServices(serviceList); + if (chosenService == nullptr) + { + std::cout << "Failed to create combo package!"; + util::pressEnter(); + return; + } + selectedServiceID.push_back(chosenService->getId()); + util::clear(); + } + std::string packageName; + double discountPercentage; + std::cout << "Enter combo package name: "; + util::read(packageName); + std::cout << "Enter discount percentage: "; + util::read(discountPercentage); + if (discountPercentage < 0.0 || discountPercentage > 100.0) + { + std::cout << "Error: Discount percentage must be between 0 and 100." << std::endl; + util::pressEnter(); + return; + } + m_controller.createComboPackage(packageName, selectedServiceID, discountPercentage); + std::cout << "Combo package '" << packageName << "' created successfully." << std::endl; + util::pressEnter(); } void AdminMenu::removeComboPackage() From 9f882610b326543e498ca9d45d88e873cc3de964 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Tue, 19 May 2026 15:26:19 +0530 Subject: [PATCH 05/15] Implement View Stock Level Functionality INV001: View Stock Level 1. Integrated InventoryManagementService into Controller to provide read-only access to inventory items. 2. Added implementation for InventoryManagementService::getInventoryItems to fetch data from DataStore. 3. Enhanced AdminMenu with viewStockLevels functionality to display inventory details (ID, part name, quantity, price). 4. Updated NotificationManagementService interface to provide concrete implementations for sendNotification, attach, detach, and notify methods. 5. Included necessary headers (InventoryItem, InventoryManagementService, iomanip) for new functionality. Precondition: 1. Admin user is logged into the system. 2. Inventory contains multiple items with varying stock levels. 3. Notification service is active and users are registered. Steps: 1. Navigate to Admin Menu and select "View Stock Levels". - Verify that the system displays all inventory items with ID, part name, quantity, and price. 2. Check items with sufficient stock. - Verify that they are displayed normally without highlighting. 3. Check items with low stock threshold. - Verify that these items are highlighted to indicate low availability. 4. Trigger a notification for a low-stock item. - Verify that the notification is sent to registered users successfully. Sreeja Reghukumar --- .../controllers/Controller.cpp | 9 +++++++- .../controllers/Controller.h | 3 +++ .../services/InventoryManagementService.cpp | 5 ++++ .../views/AdminMenu.cpp | 23 +++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..4b5b661 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -50,7 +50,14 @@ void Controller::purchaseComboPackage(const std::string& comboPackageID, const s util::Map Controller::getInventoryItems() { - return util::Map(); + auto inventoryIems = m_inventoryManagementService.getInventoryItems(); + util::Map readOnlyInventoryItems; + int inventoryItemsMapSize = inventoryIems.getSize(); + for (int index = 0; index < inventoryItemsMapSize; index++) + { + readOnlyInventoryItems.insert(inventoryIems.getKeyAt(index), inventoryIems.getValueAt(index)); + } + return readOnlyInventoryItems; } const InventoryItem* Controller::getInventoryItem(const std::string& inventoryItemID) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..a06695a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "InventoryManagementService.h"; class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + InventoryManagementService m_inventoryManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index 39ef719..3e0a872 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -1 +1,6 @@ #include "InventoryManagementService.h" + +util::Map InventoryManagementService::getInventoryItems() +{ + return m_dataStore.getInventoryItems(); +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..aad212a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,4 +1,6 @@ +#include #include "AdminMenu.h" +#include "InventoryItem.h" #include "InputHelper.h" #include "OutputHelper.h" @@ -42,6 +44,27 @@ void AdminMenu::changePassword() void AdminMenu::viewStockLevels() { + auto inventoryItems = m_controller.getInventoryItems(); + std::cout << std::left << std::setw(15) << "Item ID" + << std::setw(25) << "Part Name" + << std::setw(10) << "Quantity" + << std::setw(10) << "Price" + << std::endl; + for (int iterator = 0; iterator < inventoryItems.getSize(); ++iterator) + { + const InventoryItem* item = inventoryItems.getValueAt(iterator); + if (item != nullptr) + { + if (item->getState() != util::State::INACTIVE) + { + std::cout << std::left << std::setw(15) << item->getId() + << std::setw(25) << item->getPartName() + << std::setw(10) << item->getQuantity() + << std::setw(10) << item->getPrice() + << std::endl; + } + } + } } void AdminMenu::addInventoryItem() From 6a8b845efa5f78d4cbfa09259d4ae9b70334e411 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Tue, 19 May 2026 19:36:48 +0530 Subject: [PATCH 06/15] Implement Add Stock functionality INV002: Add Stock 1. Added Controller integration with InventoryManagementService to support adding new inventory items and updating existing stock quantities. 2. Implemented InventoryManagementService::addInventoryItem to create new items via Factory and insert them into the DataStore. 3. Implemented InventoryManagementService::addInventoryItemStock to update stock quantities for existing items. 4. Enhanced AdminMenu with options to add new items or update stock quantities, including input validation and confirmation messages. 5. Added helper functions in AdminMenu to display inventory items and handle quantity updates interactively. 6. Included necessary headers (InventoryItem, Factory, iomanip) for new functionality. Precondition: 1. Admin user is logged into the system. 2. Inventory contains existing items with unique IDs. 3. DataStore is accessible and initialized. Steps: 1. Navigate to Admin Menu and select "Add Inventory Item". - Verify that the system prompts for part name, quantity, and price. 2. Enter details for a new item with a unique part name and ID. - Verify that the item is successfully added and a confirmation message is displayed. 3. Attempt to add an item with a duplicate ID. - Verify that the system rejects the duplicate and displays an error message. 4. Select "Add Quantity" option for an existing item. - Verify that the system updates the stock quantity and displays the new total in the confirmation message. 5. Navigate to "View Stock Levels". - Verify that the updated stock quantity is reflected in the inventory list. Sreeja Reghukumar --- .../controllers/Controller.cpp | 6 + .../controllers/Controller.h | 4 + .../services/InventoryManagementService.cpp | 22 ++++ .../services/InventoryManagementService.h | 1 + .../views/AdminMenu.cpp | 112 ++++++++++++++++++ 5 files changed, 145 insertions(+) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..8c35758 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -60,12 +60,18 @@ const InventoryItem* Controller::getInventoryItem(const std::string& inventoryIt void Controller::addInventoryItem(const std::string& partName, int quantity, double price) { + m_inventoryManagementService.addInventoryItem(partName, quantity, price); } void Controller::removeInventoryItem(const std::string& inventoryItemID) { } +void Controller::addInventoryItemStock(const std::string& selectedItemId, int quantity) +{ + m_inventoryManagementService.addInventoryItemStock(selectedItemId, quantity); +} + util::Map Controller::getServiceBookings() { return util::Map(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..34f2849 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "InventoryManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + InventoryManagementService m_inventoryManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); @@ -47,5 +50,6 @@ public: util::Vector getNotifications(); void deleteNotification(const std::string& notificationID); void configureNotifications(const std::string& userID, bool paymentNotifications, bool serviceNotifications); + void addInventoryItemStock(const std::string& selectedItemId, int quantity); void runSystemChecks(); }; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index 39ef719..9bf1d91 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -1 +1,23 @@ #include "InventoryManagementService.h" +#include "InventoryItem.h" +#include "Factory.h" + +void InventoryManagementService::addInventoryItem(const std::string& partName, int quantity, double price) +{ + InventoryItem* newItem = Factory::getObject(partName, quantity, price); + m_dataStore.getInventoryItems().insert(newItem->getId(), newItem); +} + +void InventoryManagementService::addInventoryItemStock(const std::string& selectedItemId, int quantity) +{ + int index = m_dataStore.getInventoryItems().find(selectedItemId); + if (index != -1) + { + InventoryItem* item = m_dataStore.getInventoryItems().getValueAt(index); + if (item != nullptr) + { + int totalQuantity = item->getQuantity() + quantity; + item->setQuantity(totalQuantity); + } + } +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h index 099b964..c27ba64 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h @@ -17,6 +17,7 @@ public: InventoryItem* getInventoryItem(const std::string& inventoryItemID); void addInventoryItem(const std::string& partName, int quantity, double price); void removeInventoryItem(const std::string& inventoryItemID); + void addInventoryItemStock(const std::string& selectedItemId, int quantity); void sendLowStockAlerts(); void sendNotification(User* user, const std::string& title, const std::string& message) override; void attach(User* user) override; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..8b31fa9 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,8 @@ +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "InventoryItem.h" void AdminMenu::showMenu() { @@ -44,8 +46,118 @@ void AdminMenu::viewStockLevels() { } +static util::Map +filterActiveItems(const util::Map& inventoryItems) +{ + util::Map activeItems; + int inventorySize = inventoryItems.getSize(); + for (int index = 0; index < inventorySize; index++) + { + const InventoryItem* item = inventoryItems.getValueAt(index); + if (item != nullptr && item->getState() != util::State::INACTIVE) + { + activeItems.insert(item->getId(), item); + } + } + return activeItems; +} + +static void displayInventoryWithItems(util::Map& inventoryItems) +{ + int inventorySize = inventoryItems.getSize(); + std::cout << std::left << std::setw(10) << "Index" + << std::setw(15) << "Item ID" + << std::setw(25) << "Part Name" + << std::setw(10) << "Quantity" + << std::setw(10) << "Price" + << std::endl; + for (int iterator = 0; iterator < inventorySize; iterator++) + { + const InventoryItem* item = inventoryItems.getValueAt(iterator); + if (item != nullptr) + { + std::cout << std::left << std::setw(10) << (iterator + 1) + << std::setw(15) << item->getId() + << std::setw(25) << item->getPartName() + << std::setw(10) << item->getQuantity() + << std::setw(10) << item->getPrice() + << std::endl; + } + } +} + +static void addQuantityToItem(util::Map& inventoryItems, Controller& m_controller) +{ + int itemIndex; + int quantity; + auto activeItems = filterActiveItems(inventoryItems); + int activeSize = activeItems.getSize(); + if (activeSize == 0) + { + std::cout << "No active items available in Inventory" << std::endl; + return; + } + displayInventoryWithItems(activeItems); + std::cout << "Enter the index of the item to update: "; + util::read(itemIndex); + if (itemIndex < 1 || itemIndex > activeSize) + { + std::cout << "Invalid index selected." << std::endl; + return; + } + std::cout << "Enter quantity to add: "; + util::read(quantity); + if (quantity < 0) + { + std::cout << "The quantity should be Greater than 0." << std::endl; + return; + } + const InventoryItem* selectedItem = activeItems.getValueAt(itemIndex - 1); + if (selectedItem != nullptr) + { + std::string selectedItemId = selectedItem->getId(); + m_controller.addInventoryItemStock(selectedItemId, quantity); + std::cout << "Updated " << selectedItem->getPartName() + << " stock. New quantity: " << selectedItem->getQuantity() + << std::endl; + } + else + { + std::cout << "Error: Selected item could not be found." << std::endl; + } +} + void AdminMenu::addInventoryItem() { + util::clear(); + int choice, quantity; + double price; + std::string partName; + std::cout << "1. Add new item \n2. Add Quantity\nEnter your choice : "; + util::read(choice); + switch (choice) + { + case 1: + { + std::cout << "--------Enter Item Details----------\n"; + std::cout << "Part Name : "; + util::read(partName); + std::cout << "Quantity : "; + util::read(quantity); + std::cout << "Price : "; + util::read(price); + m_controller.addInventoryItem(partName, quantity, price); + std::cout << "New Item " << partName << " added to the Inventory.\n"; + break; + } + case 2: + { + auto inventoryItems = m_controller.getInventoryItems(); + addQuantityToItem(inventoryItems, m_controller); + break; + } + } + util::pressEnter(); } void AdminMenu::removeInventoryItem() From 3594fa4f26c4bea119fefe9534b47a0115b83d46 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Tue, 19 May 2026 20:37:52 +0530 Subject: [PATCH 07/15] Implement Remove Stock Functionality INV003: Remove Stock 1. Integrated InventoryManagementService into Controller to handle removal of inventory items. 2. Implemented InventoryManagementService::removeInventoryItem to mark items as INACTIVE in the datastore. 3. Enhanced AdminMenu with removeInventoryItem workflow: - Displays inventory list with index, ID, part name, quantity, and price. - Allows admin to select item by index for removal. - Provides confirmation message after successful deletion. 4. Added static helper function displayInventoryWithItems in AdminMenu for modularized inventory display. Precondition: 1. Admin user is logged into the system. 2. Inventory contains multiple items with unique IDs. 3. DataStore is initialized and accessible. Steps: 1. Navigate to Admin Menu and select "Remove Inventory Item". - Verify that the system displays all inventory items with ID, part name, quantity, and price. 2. Select an item by entering its index. - Verify that the system removes the item and displays a confirmation message. 3. Attempt to remove an item with an invalid index. - Verify that the system rejects the input and shows an error message. 4. Navigate to "View Stock Levels". - Verify that the removed item no longer appears in the inventory list. Sreeja Reghukumar --- .../controllers/Controller.cpp | 1 + .../controllers/Controller.h | 3 ++ .../services/InventoryManagementService.cpp | 14 +++++++ .../views/AdminMenu.cpp | 41 +++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..bd85497 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -64,6 +64,7 @@ void Controller::addInventoryItem(const std::string& partName, int quantity, dou void Controller::removeInventoryItem(const std::string& inventoryItemID) { + m_inventoryManagementService.removeInventoryItem(inventoryItemID); } util::Map Controller::getServiceBookings() diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..d1b73a8 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "InventoryManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + InventoryManagementService m_inventoryManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index 39ef719..2b6f7cb 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -1 +1,15 @@ #include "InventoryManagementService.h" +#include "InventoryItem.h" + +void InventoryManagementService::removeInventoryItem(const std::string& inventoryItemID) +{ + int index = m_dataStore.getInventoryItems().find(inventoryItemID); + if (index != -1) + { + InventoryItem* item = m_dataStore.getInventoryItems().getValueAt(index); + if (item != nullptr) + { + item->setState(util::State::INACTIVE); + } + } +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..30425c1 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,8 @@ +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "InventoryItem.h" void AdminMenu::showMenu() { @@ -48,8 +50,47 @@ void AdminMenu::addInventoryItem() { } +static util::Map +filterActiveItems(const util::Map& inventoryItems) +{ } + +static void displayInventoryWithItems(util::Map& inventoryItems) +{ +} + void AdminMenu::removeInventoryItem() { + util::clear(); + auto inventoryItems = m_controller.getInventoryItems(); + auto activeItems = filterActiveItems(inventoryItems); + int activeItemsSize = activeItems.getSize(); + if (activeItemsSize == 0) + { + std::cout << "No items available in Inventory." << std::endl; + util::pressEnter(); + return; + } + displayInventoryWithItems(activeItems); + int itemIndex; + std::cout << "Enter the index of the item to remove: "; + util::read(itemIndex); + if (itemIndex < 1 || itemIndex > activeItemsSize) + { + std::cout << "Invalid index selected." << std::endl; + util::pressEnter(); + return; + } + const InventoryItem* selectedItem = inventoryItems.getValueAt(itemIndex - 1); + if (selectedItem != nullptr) + { + if(selectedItem->getState() != util::State::INACTIVE) + { + std::string selectedItemId = selectedItem->getId(); + m_controller.removeInventoryItem(selectedItemId); + std::cout << "Item " << selectedItem->getPartName() << " removed successfully." << std::endl; + } + } + util::pressEnter(); } void AdminMenu::checkStockAvailability() From ef41fec2081bd2f800eaad3769f563eae91a6b9f Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Tue, 19 May 2026 21:33:24 +0530 Subject: [PATCH 08/15] Implement Check Availability Status Functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit INV004: Check Availability Status 1. Updated Controller to delegate getInventoryItem calls to InventoryManagementService. 2. Implemented InventoryManagementService::getInventoryItem to fetch items from datastore by ID. 3. Enhanced AdminMenu with checkStockAvailability function: - Accepts part ID as input. - Retrieves item details from Controller. - Displays item information (ID, part name, quantity) if found and active. - Handles inactive or missing items gracefully. Precondition: 1. Admin user is logged into the system. 2. Inventory contains multiple items with unique IDs. 3. DataStore is initialized and accessible. Steps: 1. Navigate to Admin Menu and select "Check Stock Availability". - Verify that the system prompts for an Item ID. 2. Enter a valid Item ID for an active item. - Verify that the system displays the item’s details including current quantity. 3. Enter an Item ID that does not exist. - Verify that the system displays “Item not found”. 4. Enter an Item ID for an inactive item. - Verify that the system does not display details and indicates the item is inactive. Sreeja Reghukumar --- .../controllers/Controller.cpp | 2 +- .../controllers/Controller.h | 3 +++ .../services/InventoryManagementService.cpp | 10 ++++++++++ .../views/AdminMenu.cpp | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..b9701e8 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -55,7 +55,7 @@ util::Map Controller::getInventoryItems() const InventoryItem* Controller::getInventoryItem(const std::string& inventoryItemID) { - return nullptr; + return m_inventoryManagementService.getInventoryItem(inventoryItemID); } void Controller::addInventoryItem(const std::string& partName, int quantity, double price) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..d1b73a8 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "InventoryManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + InventoryManagementService m_inventoryManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index 39ef719..457051a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -1 +1,11 @@ #include "InventoryManagementService.h" + +InventoryItem* InventoryManagementService::getInventoryItem(const std::string& inventoryItemID) +{ + int index = m_dataStore.getInventoryItems().find(inventoryItemID); + if (index != -1) + { + return m_dataStore.getInventoryItems().getValueAt(index); + } + return nullptr; +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..35f5a09 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,8 @@ +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "InventoryItem.h" void AdminMenu::showMenu() { @@ -54,6 +56,23 @@ void AdminMenu::removeInventoryItem() void AdminMenu::checkStockAvailability() { + util::clear(); + std::string itemId; + std::cout << "Enter the Item Id : "; + util::read(itemId); + const InventoryItem* selectedItem = m_controller.getInventoryItem(itemId); + if (selectedItem != nullptr) + { + if (selectedItem->getState() != util::State::INACTIVE) + { + std::cout << "Item Details\n"; + std::cout << "---------------------------------------------\n"; + std::cout << "Item ID : " << selectedItem->getId() << "\n"; + std::cout << "Part Name : " << selectedItem->getPartName() << "\n"; + std::cout << "Quantity : " << selectedItem->getQuantity() << "\n"; + } + } + util::pressEnter(); } void AdminMenu::assignJob() From 2bdf0eb7411339a4997b05c24322c1677340b35a Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 12:31:54 +0530 Subject: [PATCH 09/15] Implement Add Technician Functionality ADM001: Add Technician 1. Added UserManagementService integration in Controller to support technician account creation. 2. Updated Controller::createTechnician method to call createUser with util::UserType::TECHNICIAN. 3. Renamed parameter from 'phone' to 'phoneNumber' for clarity and consistency. 4. Enhanced AdminMenu::addTechnician with input validation for password, email, and phone number. 5. Added success and error handling messages in AdminMenu for technician creation workflow. Precondition: 1. Admin is logged into the system. 2. UserManagementService is available and connected. 3. No existing technician account with the same username/email. Steps: 1. Navigate to Admin Menu and select "Add Technician". 2. Enter technician details (username, password, email, phone number). - Verify that invalid password/email/phone inputs are rejected with error messages. 3. Enter valid technician details. - Verify that uniqueness is checked and duplicate accounts are not created. 4. Submit valid details. - Verify that technician account is created successfully and confirmation message is displayed. Sreeja Reghukumar --- .../controllers/Controller.cpp | 3 +- .../controllers/Controller.h | 5 ++- .../views/AdminMenu.cpp | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..bbab445 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -22,8 +22,9 @@ const User* Controller::getAuthenticatedUser() return nullptr; } -void Controller::createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phone) +void Controller::createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phoneNumber) { + m_userManagementService.createUser(username, password, email, phoneNumber, util::UserType::TECHNICIAN); } void Controller::updateUserDetails(const std::string& email, const std::string& phone) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..c618ede 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "UserManagementService.h" class Service; class ComboPackage; @@ -14,13 +15,15 @@ class Notification; class Controller { +private: + UserManagementService m_userManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); void changePassword(const std::string& newPassword); void createCustomer(const std::string& username, const std::string& password, const std::string& email, const std::string& phone); const User* getAuthenticatedUser(); - void createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phone); + void createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phoneNumber); void updateUserDetails(const std::string& email, const std::string& phone); util::Map getServices(); util::Map getComboPackages(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..18de5cf 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,8 @@ +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "Validator.h" void AdminMenu::showMenu() { @@ -70,6 +72,37 @@ void AdminMenu::removeService() void AdminMenu::addTechnician() { + util::clear(); + std::string username, password, email, phoneNumber; + std::cout << std::left << std::setw(25) << "Enter Technician Username:"; + util::read(username); + std::cout << std::setw(25) << "Enter Technician Password:"; + util::read(password); + if(!util::isPasswordValid(password)) + { + std::cout << "Error: Password is invalid!"; + util::pressEnter(); + return; + } + std::cout << std::setw(25) << "Enter Technician Email:"; + util::read(email); + if(!util::isEmailValid(email)) + { + std::cout << "Error: Email is invalid!"; + util::pressEnter(); + return; + } + std::cout << std::setw(25) << "Enter Technician Phone:"; + util::read(phoneNumber); + if(!util::isPhoneNumberValid(phoneNumber)) + { + std::cout << "Error: Phone Number is invalid!"; + util::pressEnter(); + return; + } + m_controller.createTechnician(username, password, email, phoneNumber); + std::cout << "\nTechnician Added Successfully.\n"; + util::pressEnter(); } void AdminMenu::removeUser() From b230e3062c6dac231cd9a7f5f2c4f0be30394ab3 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 19:25:24 +0530 Subject: [PATCH 10/15] Implement Remove Customer or Technician Functionality ADM002: Remove Technician or Customer 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. 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. Sreeja Reghukumar --- .../Trenser.VehicleServiceSystem.vcxproj | 1 + ...enser.VehicleServiceSystem.vcxproj.filters | 3 + .../controllers/Controller.cpp | 17 +++- .../controllers/Controller.h | 5 + .../models/JobCard.cpp | 8 +- .../models/JobCard.h | 12 +-- .../models/ServiceBooking.cpp | 6 +- .../models/ServiceBooking.h | 8 +- .../services/ServiceManagementService.cpp | 99 +++++++++++++++++++ .../services/UserManagementService.cpp | 29 ++++++ .../utilities/Enums.h | 16 ++- .../utilities/Utility.h | 15 +++ .../views/AdminMenu.cpp | 73 ++++++++++++++ 13 files changed, 272 insertions(+), 20 deletions(-) create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj index a65c46d..819264c 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj @@ -176,6 +176,7 @@ + diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters index 77d0509..7c17f4e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters @@ -233,5 +233,8 @@ Header Files\Models + + Header Files\Utilities + \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..3d71d7c 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -1,4 +1,5 @@ #include "Controller.h" +#include "User.h" bool Controller::login(const std::string& username, const std::string& password) { @@ -78,7 +79,13 @@ util::Map Controller::getServiceBookingsByUs util::Map Controller::getUsers() { - return util::Map(); + auto listOfUsers = m_userManagementService.getUsers(); + util::Map readOnlyUserList; + for (int iterator = 0; iterator < listOfUsers.getSize(); iterator++) + { + readOnlyUserList.insert(listOfUsers.getKeyAt(iterator), listOfUsers.getValueAt(iterator)); + } + return readOnlyUserList; } util::Map Controller::getUsers(util::UserType userType) @@ -109,6 +116,14 @@ void Controller::completeJob(const std::string& jobID) void Controller::removeUser(const std::string& userID) { + User* user = m_userManagementService.getUser(userID); + if (!user) + { + throw std::runtime_error("Error User not Found.\n"); + } + m_serviceManagementService.cancelCustomerServiceBookings(userID); + m_serviceManagementService.cancelTechnicianJobs(userID); + m_userManagementService.removeUser(userID); } void Controller::createComboPackage(const std::string& name, const util::Vector& serviceIDs, double discountPercentage) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..7d4ff6a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,8 @@ #include "Map.h" #include #include "Enums.h" +#include "UserManagementService.h" +#include "ServiceManagementService.h" class Service; class ComboPackage; @@ -14,6 +16,9 @@ class Notification; class Controller { +private: + UserManagementService m_userManagementService; + ServiceManagementService m_serviceManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp index 04e9195..b9f1eee 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp @@ -7,7 +7,7 @@ JobCard::JobCard() m_booking(nullptr), m_service(nullptr), m_technician(nullptr), - m_status(ServiceJobStatus()) {} + m_status(util::ServiceJobStatus()) {} JobCard::JobCard(const std::string& bookingId, ServiceBooking* booking, @@ -16,7 +16,7 @@ JobCard::JobCard(const std::string& bookingId, const std::string& technicianId, User* technician, const util::Timestamp& assignedDate, - ServiceJobStatus status, + util::ServiceJobStatus status, const util::Timestamp& completionDate ) : m_id("JC" + std::to_string(++m_uid)), @@ -70,7 +70,7 @@ const util::Timestamp& JobCard::getAssignedDate() const return m_assignedDate; } -ServiceJobStatus JobCard::getStatus() const +util::ServiceJobStatus JobCard::getStatus() const { return m_status; } @@ -120,7 +120,7 @@ void JobCard::setAssignedDate(const util::Timestamp& assignedDate) m_assignedDate = assignedDate; } -void JobCard::setStatus(ServiceJobStatus status) +void JobCard::setStatus(util::ServiceJobStatus status) { m_status = status; } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h index 15a8a5d..b266d40 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h @@ -1,13 +1,12 @@ #pragma once #include #include "Timestamp.h" +#include "Enums.h" class ServiceBooking; class Service; class User; -enum class ServiceJobStatus : int; - class JobCard { private: @@ -20,9 +19,8 @@ private: std::string m_technicianId; User* m_technician; util::Timestamp m_assignedDate; - ServiceJobStatus m_status; + util::ServiceJobStatus m_status; util::Timestamp m_completionDate; - public: JobCard(); JobCard(const std::string& bookingId, @@ -32,7 +30,7 @@ public: const std::string& technicianId, User* technician, const util::Timestamp& assignedDate, - ServiceJobStatus status, + util::ServiceJobStatus status, const util::Timestamp& completionDate ); const std::string& getId() const; @@ -43,7 +41,7 @@ public: const std::string& getTechnicianId() const; User* getTechnician() const; const util::Timestamp& getAssignedDate() const; - ServiceJobStatus getStatus() const; + util::ServiceJobStatus getStatus() const; const util::Timestamp& getCompletionDate() const; void setId(const std::string& id); void setBookingId(const std::string& bookingId); @@ -53,6 +51,6 @@ public: void setTechnicianId(const std::string& technicianId); void setTechnician(User* technician); void setAssignedDate(const util::Timestamp& assignedDate); - void setStatus(ServiceJobStatus status); + void setStatus(util::ServiceJobStatus status); void setCompletionDate(const util::Timestamp& completionDate); }; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp index 1fdfaf0..1985e7b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp @@ -18,7 +18,7 @@ ServiceBooking::ServiceBooking( const std::string& vehicleBrand, const std::string& vehicleModel, const std::string& assignedTechnicianId, - const std::string& assignedTechnician, + User* assignedTechnician, double discountPercentage ) : m_id("SRV" + std::to_string(++m_uid)), @@ -80,7 +80,7 @@ const std::string& ServiceBooking::getAssignedTechnicianId() const return m_assignedTechnicianId; } -const std::string& ServiceBooking::getAssignedTechnician() const +User* ServiceBooking::getAssignedTechnician() const { return m_assignedTechnician; } @@ -135,7 +135,7 @@ void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnici m_assignedTechnicianId = assignedTechnicianId; } -void ServiceBooking::setAssignedTechnician(const std::string& assignedTechnician) +void ServiceBooking::setAssignedTechnician(User* assignedTechnician) { m_assignedTechnician = assignedTechnician; } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h index 5ecc1b0..f5b96cd 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h @@ -19,7 +19,7 @@ private: std::string m_vehicleBrand; std::string m_vehicleModel; std::string m_assignedTechnicianId; - std::string m_assignedTechnician; + User* m_assignedTechnician; double m_discountPercentage; public: ServiceBooking(); @@ -34,7 +34,7 @@ public: const std::string& vehicleBrand, const std::string& vehicleModel, const std::string& assignedTechnicianId, - const std::string& assignedTechnician, + User* assignedTechnician, double discountPercentage ); const std::string& getId() const; @@ -46,7 +46,7 @@ public: const std::string& getVehicleBrand() const; const std::string& getVehicleModel() const; const std::string& getAssignedTechnicianId() const; - const std::string& getAssignedTechnician() const; + User* getAssignedTechnician() const; double getDiscountPercentage() const; void setId(const std::string& id); void setStatus(const util::ServiceJobStatus& status); @@ -57,6 +57,6 @@ public: void setVehicleBrand(const std::string& vehicleBrand); void setVehicleModel(const std::string& vehicleModel); void setAssignedTechnicianId(const std::string& assignedTechnicianId); - void setAssignedTechnician(const std::string& assignedTechnician); + void setAssignedTechnician(User* assignedTechnician); void setDiscountPercentage(double discountPercentage); }; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 156c12b..6f15664 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -1 +1,100 @@ #include "ServiceManagementService.h" +#include "DataStore.h" +#include "ServiceBooking.h" +#include "JobCard.h" +#include "Service.h" +#include "InventoryItem.h" + +void ServiceManagementService::cancelCustomerServiceBookings(const std::string& userID) +{ + const int INCREMENT_VALUE = 1; + auto& users = m_dataStore.getUsers(); + int userIndex = users.find(userID); + if (userIndex == -1) + { + throw std::runtime_error("User not found: " + userID); + } + User* user = users.getValueAt(userIndex); + if (user == nullptr) + { + throw std::runtime_error("User not found: " + userID); + } + util::UserType type = user->getUserType(); + auto& bookings = DataStore::getInstance().getServiceBookings(); + for (int bookingIterator = 0; bookingIterator < bookings.getSize(); bookingIterator++) + { + ServiceBooking* booking = bookings.getValueAt(bookingIterator); + if (booking != nullptr && + (booking->getCustomerId() == userID || booking->getAssignedTechnicianId() == userID)) + { + if (booking->getStatus() == util::ServiceJobStatus::PENDING || + booking->getStatus() == util::ServiceJobStatus::STARTED) + { + if (type == util::UserType::CUSTOMER) + { + booking->setStatus(util::ServiceJobStatus::CANCELLED); + booking->setCustomer(nullptr); + booking->setCustomerId(""); + User* assignedTechnician = booking->getAssignedTechnician(); + sendNotification(assignedTechnician, "Customer Service Cancelled", "Uh?Oh. The customer has cancelled their service booking. Your assigned job card has been cancelled and the inventory has been restocked."); + } + else if (type == util::UserType::TECHNICIAN) + { + booking->setStatus(util::ServiceJobStatus::PENDING); + sendNotification(booking->getCustomer(), "Technician Unavailable", "Your assigned technician is no longer available. Your booking has been reset to pending, and we will reassign a new technician shortly."); + } + booking->setAssignedTechnician(nullptr); + booking->setAssignedTechnicianId(""); + const auto& ListOfServices = booking->getServices(); + for (int serviceIterator = 0; serviceIterator < ListOfServices.getSize(); serviceIterator++) + { + Service* service = ListOfServices.getValueAt(serviceIterator); + if (service != nullptr) + { + const auto& items = service->getRequiredInventoryItems(); + for (int itemIterator = 0; itemIterator < items.getSize(); itemIterator++) + { + InventoryItem* item = items.getValueAt(itemIterator); + if (item != nullptr) + { + item->setQuantity(item->getQuantity() + INCREMENT_VALUE); + } + } + } + } + } + } + } +} + + +void ServiceManagementService::cancelTechnicianJobs(const std::string& technicianID) +{ + const int INCREMENT_VALUE = 1; + auto& jobs = m_dataStore.getJobCards(); + for (int jobIterator = 0; jobIterator < jobs.getSize(); jobIterator++) + { + JobCard* job = jobs.getValueAt(jobIterator); + if (job != nullptr && job->getTechnicianId() == technicianID) + { + if (job->getStatus() == util::ServiceJobStatus::PENDING || job->getStatus() == util::ServiceJobStatus::STARTED) + { + job->setStatus(util::ServiceJobStatus::CANCELLED); + sendNotification(job->getTechnician(), "Job Cancelled", "The Job has cancelled. Your job card has been cancelled and the inventory has been restocked."); + Service* service = job->getService(); + if (service != nullptr) + { + const auto& items = service->getRequiredInventoryItems(); + for (int itemIterator = 0; itemIterator < items.getSize(); itemIterator++) + { + InventoryItem* item = items.getValueAt(itemIterator); + if (item != nullptr) + { + item->setQuantity(item->getQuantity() + INCREMENT_VALUE); + } + } + } + } + } + } +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp index 2a5bd9e..4e26942 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp @@ -1 +1,30 @@ #include "UserManagementService.h" +#include "User.h" + +util::Map UserManagementService::getUsers() +{ + return m_dataStore.getUsers(); +} + +User* UserManagementService::getUser(const std::string& userID) +{ + int index = m_dataStore.getUsers().find(userID); + if (index != -1) + { + return m_dataStore.getUsers().getValueAt(index); + } + return nullptr; +} + +void UserManagementService::removeUser(const std::string& userID) +{ + int index = m_dataStore.getUsers().find(userID); + if (index != -1) + { + User* user = m_dataStore.getUsers().getValueAt(index); + if (user != nullptr) + { + user->setState(util::State::INACTIVE); + } + } +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h index 24bbdcd..efaa387 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h @@ -24,8 +24,10 @@ namespace util enum class ServiceJobStatus { + PENDING, STARTED, - COMPLETED + COMPLETED, + CANCELLED }; enum class State @@ -121,10 +123,14 @@ namespace util { switch (status) { + case ServiceJobStatus::PENDING: + return "PENDING"; case ServiceJobStatus::STARTED: return "STARTED"; case ServiceJobStatus::COMPLETED: return "COMPLETED"; + case ServiceJobStatus::CANCELLED: + return "CANCELLED"; } throw std::invalid_argument("Invalid ServiceJobStatus"); } @@ -139,6 +145,14 @@ namespace util { return ServiceJobStatus::COMPLETED; } + if (value == "PENDING") + { + return ServiceJobStatus::PENDING; + } + if (value == "CANCELLED") + { + return ServiceJobStatus::CANCELLED; + } throw std::invalid_argument("Invalid ServiceJobStatus string"); } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h new file mode 100644 index 0000000..cb9b990 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h @@ -0,0 +1,15 @@ +#pragma once +#include "Service.h" +#include "InventoryItem.h" + +inline double calculatePartsCost(const Service* service) +{ + double cost = 0; + auto& requiredInventoryItems = service->getRequiredInventoryItems(); + int requiredInventoryItemsSize = requiredInventoryItems.getSize(); + for (int index = 0; index < requiredInventoryItemsSize; index++) + { + cost += requiredInventoryItems.getValueAt(index)->getPrice(); + } + return cost; +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..39caee5 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,8 @@ +#include #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "User.h" void AdminMenu::showMenu() { @@ -72,8 +74,79 @@ void AdminMenu::addTechnician() { } +static util::Map +filterActiveUsers(const util::Map& listOfUsers) +{ + util::Map activeUsers; + int inventorySize = listOfUsers.getSize(); + for (int index = 0; index < inventorySize; index++) + { + const User* user = listOfUsers.getValueAt(index); + if (user != nullptr && user->getState() != util::State::INACTIVE) + { + activeUsers.insert(user->getId(), user); + } + } + return activeUsers; +} + +static void displayAllActiveUsers(util::Map& activeUsers, int activeUserCount) +{ + std::cout << std::left << std::setw(10) << "Index" + << std::setw(15) << "User ID" + << std::setw(25) << "Username" + << std::setw(25) << "User Type" + << std::endl; + for (int iterator = 0; iterator < activeUserCount; iterator++) + { + const User* user = activeUsers.getValueAt(iterator); + if (user != nullptr) + { + std::cout << std::left << std::setw(10) << (iterator + 1) + << std::setw(15) << user->getId() + << std::setw(25) << user->getUserName() + << std::setw(25) << util::getUserTypeString(user->getUserType()) + << std::endl; + } + else + { + std::cout << "No users found.\n"; + util::pressEnter(); + return; + } + } +} + void AdminMenu::removeUser() { + util::clear(); + int indexChoice; + auto listOfUsers = m_controller.getUsers(); + auto listOfActiveUsers = filterActiveUsers(listOfUsers); + int activeUserCount = listOfActiveUsers.getSize(); + if (activeUserCount < 1) + { + std::cout << "No Active users." << std::endl; + util::pressEnter(); + return; + } + displayAllActiveUsers(listOfActiveUsers, activeUserCount); + std::cout << "Enter the index of the user to delete : "; + util::read(indexChoice); + if (indexChoice < 1 || indexChoice > activeUserCount) + { + std::cout << "Error Invaild index.\n" << std::endl; + util::pressEnter(); + return; + } + const User* userToRemove = listOfActiveUsers.getValueAt(indexChoice - 1); + if (userToRemove != nullptr) + { + std::string userIdToRemove = userToRemove->getId(); + m_controller.removeUser(userIdToRemove); + std::cout << userToRemove->getUserName() << " removed Successfully.\n"; + } + util::pressEnter(); } void AdminMenu::createComboPackages() From fa08d4a90fb619c304cee4079a8d63c583d6531b Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 19:42:45 +0530 Subject: [PATCH 11/15] Implement Login Functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADM003: Login 1. Added credential input handling in UserInterface::login with username and password prompts. 2. Integrated Controller::login to validate credentials and retrieve authenticated user. 3. Implemented role-based menu navigation: Admin → AdminMenu, Technician → TechnicianMenu, Customer → CustomerMenu. 4. Added error handling for invalid credentials and unknown user types with clear feedback messages. 5. Included util::clear for screen refresh and structured output formatting during login. Precondition: 1. Valid user accounts exist in the system (Admin, Technician, Customer). 2. Controller is connected to UserManagementService for authentication. 3. UserInterface is initialized with role-specific menus. Steps: 1. Launch UserInterface and select "Login". 2. Enter incorrect username or password. - Verify that system displays "Error: Invalid Username or Password". 3. Enter valid admin credentials. - Verify that AdminMenu is displayed successfully. 4. Enter valid technician or customer credentials. - Verify that TechnicianMenu or CustomerMenu is displayed accordingly. Sreeja Reghukumar --- .../views/UserInterface.cpp | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp index 122f9a8..3fa0ea6 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp @@ -1,6 +1,7 @@ #include "UserInterface.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "User.h" void UserInterface::run() { @@ -48,7 +49,38 @@ bool UserInterface::handleOperation(int choice) void UserInterface::login() { - + std::string username, password; + util::clear(); + std::cout << "Enter username: "; + util::read(username); + std::cout << "Enter password: "; + util::read(password); + if (m_controller.login(username, password)) + { + const User* authenticatedUser = m_controller.getAuthenticatedUser(); + if (authenticatedUser != nullptr) + { + switch (authenticatedUser->getUserType()) + { + case util::UserType::ADMIN: + m_adminMenu.showMenu(); + break; + case util::UserType::TECHNICIAN: + m_technicianMenu.showMenu(); + break; + case util::UserType::CUSTOMER: + m_customerMenu.showMenu(); + break; + default: + std::cout << "\nError: Unknown user type"; + break; + } + } + } + else + { + std::cout << "\nError: Invalid Username or Password"; + } } void UserInterface::registerCustomer() From d161ac313c31224703e3e5c54a0f0e73aceedf22 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 20:21:21 +0530 Subject: [PATCH 12/15] Implement Change Password Functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADM005: Change Password 1. Added AuthenticationManagementService::changePassword to update the authenticated user’s password with validation. 2. Integrated Controller::changePassword to delegate password update requests to AuthenticationManagementService. 3. Enhanced AdminMenu::changePassword to prompt for new password, validate strength using Validator, and confirm update. 4. Added error handling to prevent password change when no user is logged in. 5. Provided user feedback messages for invalid password attempts and successful updates. Precondition: 1. Admin is logged into the system. 2. AuthenticationManagementService maintains active session. 3. Validator is available for password strength checks. Steps: 1. Navigate to Admin Menu and select "Change Password". 2. Enter old password incorrectly. - Verify that system rejects the attempt and displays error. 3. Enter new password that fails validation (length/complexity). - Verify that system rejects with "Error: Password is not strong enough!". 4. Enter valid old password and strong new password. - Verify that system confirms "Password changed successfully" and updates the user’s password. Sreeja Reghukumar --- .../controllers/Controller.cpp | 1 + .../controllers/Controller.h | 3 +++ .../AuthenticationManagementService.cpp | 10 +++++++++ .../views/AdminMenu.cpp | 18 +++++++++++++++ .../views/TechnicianMenu.cpp | 22 +++++++++++++++++++ .../views/TechnicianMenu.h | 1 + 6 files changed, 55 insertions(+) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index d536e8a..931def8 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -11,6 +11,7 @@ void Controller::logout() void Controller::changePassword(const std::string& newPassword) { + m_authenticationManagementService.changePassword(newPassword); } void Controller::createCustomer(const std::string& username, const std::string& password, const std::string& email, const std::string& phone) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 3aabb58..0333e80 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -2,6 +2,7 @@ #include "Map.h" #include #include "Enums.h" +#include "AuthenticationManagementService.h" class Service; class ComboPackage; @@ -14,6 +15,8 @@ class Notification; class Controller { +private: + AuthenticationManagementService m_authenticationManagementService; public: bool login(const std::string& username, const std::string& password); void logout(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp index ca07fee..54610e1 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp @@ -1,3 +1,13 @@ #include "AuthenticationManagementService.h" +#include "User.h" User* AuthenticationManagementService::m_authenticatedUser = nullptr; + +void AuthenticationManagementService::changePassword(const std::string& newPassword) +{ + if (m_authenticatedUser == nullptr) + { + throw std::runtime_error("There is no user currently logged in!"); + } + m_authenticatedUser->setPassword(newPassword); +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 0432f3c..d1c596d 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,6 +1,7 @@ #include "AdminMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "Validator.h" void AdminMenu::showMenu() { @@ -38,6 +39,23 @@ void AdminMenu::logout() void AdminMenu::changePassword() { + std::string newPassword; + while (true) + { + util::clear(); + std::cout << "Enter new password: "; + util::read(newPassword); + if (!util::isPasswordValid(newPassword)) + { + std::cout << "Error: Password is not strong enough!\n"; + util::pressEnter(); + continue; + } + m_controller.changePassword(newPassword); + std::cout << "Password changed successfully\n"; + util::pressEnter(); + break; + } } void AdminMenu::viewStockLevels() diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp index d6c4d57..b0b3c77 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp @@ -1,6 +1,7 @@ #include "TechnicianMenu.h" #include "InputHelper.h" #include "OutputHelper.h" +#include "Validator.h" void TechnicianMenu::showMenu() { @@ -38,3 +39,24 @@ void TechnicianMenu::completeJob() void TechnicianMenu::viewNotifications() { } + +void TechnicianMenu::changePassword() +{ + std::string newPassword; + while (true) + { + util::clear(); + std::cout << "Enter new password: "; + util::read(newPassword); + if (!util::isPasswordValid(newPassword)) + { + std::cout << "Error: Password is not strong enough!\n"; + util::pressEnter(); + continue; + } + m_controller.changePassword(newPassword); + std::cout << "Password changed successfully\n"; + util::pressEnter(); + break; + } +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h index c366d9b..cbf5fc6 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h @@ -10,4 +10,5 @@ public: void showMenu(); void completeJob(); void viewNotifications(); + void changePassword(); }; From 6ca659c5735c467a8d365bbf460cefb4783149b4 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Fri, 22 May 2026 11:27:49 +0530 Subject: [PATCH 13/15] Add standardized documentation headers --- .../controllers/Controller.cpp | 49 ++++++++++++ .../controllers/Controller.h | 8 ++ .../services/InventoryManagementService.cpp | 42 ++++++++++ .../services/InventoryManagementService.h | 8 ++ .../views/AdminMenu.cpp | 76 ++++++++++++++++--- .../views/AdminMenu.h | 8 ++ 6 files changed, 182 insertions(+), 9 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index 45c9c5f..21bc7de 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -1,5 +1,20 @@ +/* +File: Controller.cpp +Description: Implementation file containing the method definitions + of the Controller class, which manages user authentication, + inventory, services, bookings, and notifications. +Author: Trenser +Date:19-May-2026 +*/ #include "Controller.h" +/* +Function: login +Description: Authenticates a user based on provided credentials. +Parameter: const std::string& username - the username of the user + const std::string& password - the password of the user +Return type: bool +*/ bool Controller::login(const std::string& username, const std::string& password) { return false; @@ -48,6 +63,13 @@ void Controller::purchaseComboPackage(const std::string& comboPackageID, const s { } +/* +Function: getInventoryItems +Description: Retrieves all inventory items from the inventory management service + and constructs a read-only map for external use. +Parameter: None +Return type: util::Map +*/ util::Map Controller::getInventoryItems() { auto inventoryIems = m_inventoryManagementService.getInventoryItems(); @@ -60,21 +82,48 @@ util::Map Controller::getInventoryItems() return readOnlyInventoryItems; } +/* +Function: getInventoryItem +Description: Retrieves a specific inventory item by its ID from the inventory management service. +Parameter: const std::string& inventoryItemID - ID of the inventory item +Return type: const InventoryItem* +*/ const InventoryItem* Controller::getInventoryItem(const std::string& inventoryItemID) { return m_inventoryManagementService.getInventoryItem(inventoryItemID); } +/* +Function: addInventoryItem +Description: Adds a new inventory item with specified details to the inventory management service. +Parameter: const std::string& partName - name of the part + int quantity - quantity of the part + double price - price of the part +Return type: void +*/ void Controller::addInventoryItem(const std::string& partName, int quantity, double price) { m_inventoryManagementService.addInventoryItem(partName, quantity, price); } +/* +Function: removeInventoryItem +Description: Removes an inventory item from the inventory management service by its ID. +Parameter: const std::string& inventoryItemID - ID of the inventory item +Return type: void +*/ void Controller::removeInventoryItem(const std::string& inventoryItemID) { m_inventoryManagementService.removeInventoryItem(inventoryItemID); } +/* +Function: addInventoryItemStock +Description: Adds stock to an existing inventory item in the inventory management service. +Parameter: const std::string& selectedItemId - ID of the inventory item + int quantity - quantity to add +Return type: void +*/ void Controller::addInventoryItemStock(const std::string& selectedItemId, int quantity) { m_inventoryManagementService.addInventoryItemStock(selectedItemId, quantity); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 1d849de..47ebe1f 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -1,3 +1,11 @@ +/* +File: Controller.h +Description: Header file declaring the Controller class, which manages + user authentication, inventory, services, bookings, job cards, + invoices, and notifications in the system. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include "Map.h" #include diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index 0cd72de..ef48930 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -1,13 +1,37 @@ +/* +File: InventoryManagementService.cpp +Description: Implementation file containing the method definitions of the + InventoryManagementService class, including inventory operations + and notification handling. +Author: Trenser +Date:19-May-2026 +*/ #include "InventoryManagementService.h" #include "InventoryItem.h" #include "Factory.h" +/* +Function: addInventoryItem +Description: Creates a new inventory item using the Factory and inserts it + into the DataStore. +Parameter: const std::string& partName - name of the part + int quantity - initial quantity of the part + double price - price of the part +Return type: void +*/ void InventoryManagementService::addInventoryItem(const std::string& partName, int quantity, double price) { InventoryItem* newItem = Factory::getObject(partName, quantity, price); m_dataStore.getInventoryItems().insert(newItem->getId(), newItem); } +/* +Function: addInventoryItemStock +Description: Increases the stock quantity of an existing inventory item. +Parameter: const std::string& selectedItemId - ID of the inventory item + int quantity - quantity to add +Return type: void +*/ void InventoryManagementService::addInventoryItemStock(const std::string& selectedItemId, int quantity) { int index = m_dataStore.getInventoryItems().find(selectedItemId); @@ -22,11 +46,23 @@ void InventoryManagementService::addInventoryItemStock(const std::string& select } } +/* +Function: getInventoryItems +Description: Retrieves all inventory items stored in the DataStore. +Parameter: None +Return type: util::Map +*/ util::Map InventoryManagementService::getInventoryItems() { return m_dataStore.getInventoryItems(); } +/* +Function: removeInventoryItem +Description: Marks an inventory item as inactive instead of deleting it. +Parameter: const std::string& inventoryItemID - ID of the inventory item +Return type: void +*/ void InventoryManagementService::removeInventoryItem(const std::string& inventoryItemID) { int index = m_dataStore.getInventoryItems().find(inventoryItemID); @@ -40,6 +76,12 @@ void InventoryManagementService::removeInventoryItem(const std::string& inventor } } +/* +Function: getInventoryItem +Description: Retrieves a specific inventory item by its ID from the DataStore. +Parameter: const std::string& inventoryItemID - ID of the inventory item +Return type: InventoryItem* +*/ InventoryItem* InventoryManagementService::getInventoryItem(const std::string& inventoryItemID) { int index = m_dataStore.getInventoryItems().find(inventoryItemID); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h index c27ba64..e7c549c 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h @@ -1,3 +1,11 @@ +/* +File: InventoryManagementService.h +Description: Header file declaring the InventoryManagementService class, + which manages inventory items, stock updates, and notifications + related to low stock alerts. Inherits from NotificationManagementService. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 87b9011..6b59088 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,10 +1,23 @@ +/* +File: AdminMenu.cpp +Description: Implementation file containing the method definitions of the + AdminMenu class, including menu handling, inventory operations, + and stock management functions. +Author: Trenser +Date:19-May-2026 +*/ #include #include "AdminMenu.h" #include "InventoryItem.h" #include "InputHelper.h" #include "OutputHelper.h" -#include "InventoryItem.h" +/* +Function: showMenu +Description: Displays the admin menu and handles user input until the menu is exited. +Parameter: None +Return type: void +*/ void AdminMenu::showMenu() { bool isMenuActive = true; @@ -43,6 +56,13 @@ void AdminMenu::changePassword() { } +/* +Function: viewStockLevels +Description: Displays all active inventory items with their details + including ID, part name, quantity, and price. +Parameter: None +Return type: void +*/ void AdminMenu::viewStockLevels() { auto inventoryItems = m_controller.getInventoryItems(); @@ -68,6 +88,14 @@ void AdminMenu::viewStockLevels() } } +/* +Function: filterActiveItems +Description: Filters out inactive inventory items and returns a map + containing only active items. +Parameter: const util::Map& inventoryItems - + map of all inventory items +Return type: util::Map +*/ static util::Map filterActiveItems(const util::Map& inventoryItems) { @@ -84,6 +112,14 @@ filterActiveItems(const util::Map& inventoryI return activeItems; } +/* +Function: displayInventoryWithItems +Description: Displays inventory items in a tabular format with index, ID, + part name, quantity, and price. +Parameter: util::Map& inventoryItems - + map of inventory items to display +Return type: void +*/ static void displayInventoryWithItems(util::Map& inventoryItems) { int inventorySize = inventoryItems.getSize(); @@ -108,6 +144,15 @@ static void displayInventoryWithItems(util::Map& inventoryItems - + map of inventory items + Controller& m_controller - controller instance to update stock +Return type: void +*/ static void addQuantityToItem(util::Map& inventoryItems, Controller& m_controller) { int itemIndex; @@ -149,6 +194,13 @@ static void addQuantityToItem(util::Map& inve } } +/* +Function: addInventoryItem +Description: Allows the admin to either add a new inventory item + or increase the quantity of an existing item. +Parameter: None +Return type: void +*/ void AdminMenu::addInventoryItem() { util::clear(); @@ -182,14 +234,13 @@ void AdminMenu::addInventoryItem() util::pressEnter(); } -static util::Map -filterActiveItems(const util::Map& inventoryItems) -{ } - -static void displayInventoryWithItems(util::Map& inventoryItems) -{ -} - +/* +Function: removeInventoryItem +Description: Removes an active inventory item by marking it inactive + after user selection. +Parameter: None +Return type: void +*/ void AdminMenu::removeInventoryItem() { util::clear(); @@ -225,6 +276,13 @@ void AdminMenu::removeInventoryItem() util::pressEnter(); } +/* +Function: checkStockAvailability +Description: Checks if a specific inventory item is available + and displays its details if active. +Parameter: None +Return type: void +*/ void AdminMenu::checkStockAvailability() { util::clear(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h index 05fdd84..d65b720 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h @@ -1,3 +1,11 @@ +/* +File: AdminMenu.h +Description: Header file declaring the AdminMenu class, which provides + administrative operations such as inventory management, + user management, service configuration, and notifications. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include "Controller.h" From c5f87a0c689913e889b44a7a7b7f42ac82a22da8 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Fri, 22 May 2026 12:34:11 +0530 Subject: [PATCH 14/15] Add standardized documentation headers --- .../controllers/Controller.cpp | 73 +++++++- .../controllers/Controller.h | 10 +- .../models/JobCard.cpp | 150 ++++++++++++++++ .../models/JobCard.h | 8 + .../models/ServiceBooking.cpp | 164 ++++++++++++++++++ .../models/ServiceBooking.h | 8 + .../AuthenticationManagementService.cpp | 22 +++ .../AuthenticationManagementService.h | 8 + .../services/ServiceManagementService.cpp | 45 ++++- .../services/ServiceManagementService.h | 8 + .../services/UserManagementService.cpp | 25 +++ .../services/UserManagementService.h | 9 +- .../utilities/Utility.h | 14 ++ .../views/AdminMenu.cpp | 103 ++++++++++- .../views/AdminMenu.h | 8 + .../views/TechnicianMenu.cpp | 33 ++++ .../views/TechnicianMenu.h | 8 + .../views/UserInterface.cpp | 28 +++ .../views/UserInterface.h | 9 + 19 files changed, 720 insertions(+), 13 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index 28287a7..9c039fd 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -1,3 +1,11 @@ +/* +File: Controller.cpp +Description: Implementation file containing the method definitions of the + Controller class, which manages authentication, users, services, + combo packages, and inventory operations. +Author: Trenser +Date:19-May-2026 +*/ #include "Controller.h" #include "ComboPackage.h" #include "User.h" @@ -7,11 +15,25 @@ bool Controller::login(const std::string& username, const std::string& password) return false; } +/* +Function: logout +Description: Logs out the currently authenticated user by delegating + to the authentication management service. +Parameter: None +Return type: void +*/ void Controller::logout() { m_authenticationManagementService.logout(); } +/* +Function: changePassword +Description: Updates the password of the authenticated user by delegating + to the authentication management service. +Parameter: const std::string& newPassword - the new password to set +Return type: void +*/ void Controller::changePassword(const std::string& newPassword) { m_authenticationManagementService.changePassword(newPassword); @@ -26,9 +48,19 @@ const User* Controller::getAuthenticatedUser() return nullptr; } -void Controller::createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phoneNumber) +/* +Function: createTechnician +Description: Creates a new technician account with provided details by + delegating to the user management service. +Parameter: const std::string& username - technician's username + const std::string& password - technician's password + const std::string& email - technician's email address + const std::string& phoneNumber - technician's phone number +Return type: void +*/ +void Controller::createTechnician(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phoneNumber) { - m_userManagementService.createUser(username, password, email, phoneNumber, util::UserType::TECHNICIAN); + m_userManagementService.createUser(username, name, password, email, phoneNumber, util::UserType::TECHNICIAN); } void Controller::updateUserDetails(const std::string& email, const std::string& phone) @@ -40,6 +72,13 @@ util::Map Controller::getServices() return util::Map(); } +/* +Function: getComboPackages +Description: Retrieves all available combo packages from the service + management service and constructs a read-only map. +Parameter: None +Return type: util::Map +*/ util::Map Controller::getComboPackages() { util::Map currentAvailableComboPackages = m_serviceManagementService.getComboPackages(); @@ -91,6 +130,13 @@ util::Map Controller::getServiceBookingsByUs return util::Map(); } +/* +Function: getUsers +Description: Retrieves all users from the user management service and + constructs a read-only map. +Parameter: None +Return type: util::Map +*/ util::Map Controller::getUsers() { auto listOfUsers = m_userManagementService.getUsers(); @@ -128,6 +174,13 @@ void Controller::completeJob(const std::string& jobID) { } +/* +Function: removeUser +Description: Removes a user by ID. Cancels associated service bookings + and technician jobs before removing the user from the system. +Parameter: const std::string& userID - ID of the user to remove +Return type: void +*/ void Controller::removeUser(const std::string& userID) { User* user = m_userManagementService.getUser(userID); @@ -140,11 +193,27 @@ void Controller::removeUser(const std::string& userID) m_userManagementService.removeUser(userID); } +/* +Function: createComboPackage +Description: Creates a new combo package with specified services and discount + percentage by delegating to the service management service. +Parameter: const std::string& name - name of the combo package + const util::Vector& serviceIDs - list of service IDs + double discountPercentage - discount percentage for the package +Return type: void +*/ void Controller::createComboPackage(const std::string& name, const util::Vector& serviceIDs, double discountPercentage) { m_serviceManagementService.createComboPackage(name, serviceIDs, discountPercentage); } +/* +Function: removeComboPackage +Description: Removes a combo package by ID by delegating to the service + management service. +Parameter: const std::string& comboPackageID - ID of the combo package +Return type: void +*/ void Controller::removeComboPackage(const std::string& comboPackageID) { m_serviceManagementService.removeComboPackage(comboPackageID); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index e1adede..6d9a083 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -1,3 +1,11 @@ +/* +File: Controller.h +Description: Header file declaring the Controller class, which manages + user authentication, inventory, services, bookings, job cards, + invoices, and notifications in the system. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "Map.h" @@ -27,7 +35,7 @@ public: void changePassword(const std::string& newPassword); void createCustomer(const std::string& username, const std::string& password, const std::string& email, const std::string& phone); const User* getAuthenticatedUser(); - void createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phoneNumber); + void createTechnician(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phoneNumber); void updateUserDetails(const std::string& email, const std::string& phone); util::Map getServices(); util::Map getComboPackages(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp index b9f1eee..7e441f2 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp @@ -1,7 +1,22 @@ +/* +File: JobCard.cpp +Description: Implementation file containing the method definitions of the + JobCard class, including constructors, getters, and setters + for job card attributes. +Author: Trenser +Date:19-May-2026 +*/ #include "JobCard.h" int JobCard::m_uid = 0; +/* +Function: JobCard +Description: Default constructor that initializes a new job card with + a unique ID and default values. +Parameter: None +Return type: Constructor +*/ JobCard::JobCard() : m_id("JC" + std::to_string(++m_uid)), m_booking(nullptr), @@ -9,6 +24,21 @@ JobCard::JobCard() m_technician(nullptr), m_status(util::ServiceJobStatus()) {} +/* +Function: JobCard +Description: Parameterized constructor that initializes a job card with + booking, service, technician, and status details. +Parameter: const std::string& bookingId - ID of the booking + ServiceBooking* booking - pointer to the booking object + Service* service - pointer to the service object + const std::string& serviceId - ID of the service + const std::string& technicianId - ID of the technician + User* technician - pointer to the technician object + const util::Timestamp& assignedDate - date when job was assigned + util::ServiceJobStatus status - current status of the job + const util::Timestamp& completionDate - date when job was completed +Return type: Constructor +*/ JobCard::JobCard(const std::string& bookingId, ServiceBooking* booking, Service* service, @@ -30,101 +60,221 @@ JobCard::JobCard(const std::string& bookingId, m_status(status), m_completionDate(completionDate) {} +/* +Function: getId +Description: Retrieves the unique identifier of the job card. +Parameter: None +Return type: const std::string& +*/ const std::string& JobCard::getId() const { return m_id; } +/* +Function: getBookingId +Description: Retrieves the booking ID associated with the job card. +Parameter: None +Return type: const std::string& +*/ const std::string& JobCard::getBookingId() const { return m_bookingId; } +/* +Function: getBooking +Description: Retrieves the booking object associated with the job card. +Parameter: None +Return type: ServiceBooking* +*/ ServiceBooking* JobCard::getBooking() const { return m_booking; } +/* +Function: getService +Description: Retrieves the service object associated with the job card. +Parameter: None +Return type: Service* +*/ Service* JobCard::getService() const { return m_service; } +/* +Function: getServiceId +Description: Retrieves the service ID associated with the job card. +Parameter: None +Return type: const std::string& +*/ const std::string& JobCard::getServiceId() const { return m_serviceId; } +/* +Function: getTechnicianId +Description: Retrieves the technician ID assigned to the job card. +Parameter: None +Return type: const std::string& +*/ const std::string& JobCard::getTechnicianId() const { return m_technicianId; } +/* +Function: getTechnician +Description: Retrieves the technician object assigned to the job card. +Parameter: None +Return type: User* +*/ User* JobCard::getTechnician() const { return m_technician; } +/* +Function: getAssignedDate +Description: Retrieves the date when the job was assigned. +Parameter: None +Return type: const util::Timestamp& +*/ const util::Timestamp& JobCard::getAssignedDate() const { return m_assignedDate; } +/* +Function: getStatus +Description: Retrieves the current status of the job card. +Parameter: None +Return type: util::ServiceJobStatus +*/ util::ServiceJobStatus JobCard::getStatus() const { return m_status; } +/* +Function: getCompletionDate +Description: Retrieves the completion date of the job card. +Parameter: None +Return type: const util::Timestamp& +*/ const util::Timestamp& JobCard::getCompletionDate() const { return m_completionDate; } +/* +Function: setId +Description: Sets the unique identifier of the job card. +Parameter: const std::string& id - new job card ID +Return type: void +*/ void JobCard::setId(const std::string& id) { m_id = id; } +/* +Function: setBookingId +Description: Sets the booking ID for the job card. +Parameter: const std::string& bookingId - new booking ID +Return type: void +*/ void JobCard::setBookingId(const std::string& bookingId) { m_bookingId = bookingId; } +/* +Function: setBooking +Description: Sets the booking object for the job card. +Parameter: ServiceBooking* booking - pointer to the booking object +Return type: void +*/ void JobCard::setBooking(ServiceBooking* booking) { m_booking = booking; } +/* +Function: setService +Description: Sets the service object for the job card. +Parameter: Service* service - pointer to the service object +Return type: void +*/ void JobCard::setService(Service* service) { m_service = service; } +/* +Function: setServiceId +Description: Sets the service ID for the job card. +Parameter: const std::string& serviceId - new service ID +Return type: void +*/ void JobCard::setServiceId(const std::string& serviceId) { m_serviceId = serviceId; } +/* +Function: setTechnicianId +Description: Sets the technician ID for the job card. +Parameter: const std::string& technicianId - new technician ID +Return type: void +*/ void JobCard::setTechnicianId(const std::string& technicianId) { m_technicianId = technicianId; } +/* +Function: setTechnician +Description: Sets the technician object for the job card. +Parameter: User* technician - pointer to the technician object +Return type: void +*/ void JobCard::setTechnician(User* technician) { m_technician = technician; } +/* +Function: setAssignedDate +Description: Sets the assigned date for the job card. +Parameter: const util::Timestamp& assignedDate - new assigned date +Return type: void +*/ void JobCard::setAssignedDate(const util::Timestamp& assignedDate) { m_assignedDate = assignedDate; } +/* +Function: setStatus +Description: Sets the status of the job card. +Parameter: util::ServiceJobStatus status - new job status +Return type: void +*/ void JobCard::setStatus(util::ServiceJobStatus status) { m_status = status; } +/* +Function: setCompletionDate +Description: Sets the completion date for the job card. +Parameter: const util::Timestamp& completionDate - new completion date +Return type: void +*/ void JobCard::setCompletionDate(const util::Timestamp& completionDate) { m_completionDate = completionDate; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h index b266d40..91cb0e5 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h @@ -1,3 +1,11 @@ +/* +File: JobCard.h +Description: Header file declaring the JobCard class, which represents + a service job card containing booking, service, technician, + and status details. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "Timestamp.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp index 1985e7b..5b843bc 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp @@ -1,12 +1,44 @@ +/* +File: ServiceBooking.cpp +Description: Implementation file containing the method definitions of the + ServiceBooking class, including constructors, getters, and setters + for booking attributes. +Author: Trenser +Date:19-May-2026 +*/ #include "ServiceBooking.h" int ServiceBooking::m_uid = 0; +/* +Function: ServiceBooking +Description: Default constructor that initializes a new service booking + with a unique ID, no customer, and zero discount. +Parameter: None +Return type: Constructor +*/ ServiceBooking::ServiceBooking() : m_id("SRV" + std::to_string(++m_uid)), m_customer(nullptr), m_discountPercentage(0.0) {} +/* +Function: ServiceBooking +Description: Parameterized constructor that initializes a service booking + with customer, vehicle, technician, and discount details. +Parameter: const std::string& id - booking ID + util::ServiceJobStatus status - current booking status + const util::Map& services - map of services + const std::string& customerId - ID of the customer + User* customer - pointer to the customer object + const std::string& vehicleNumber - vehicle registration number + const std::string& vehicleBrand - brand of the vehicle + const std::string& vehicleModel - model of the vehicle + const std::string& assignedTechnicianId - ID of the assigned technician + User* assignedTechnician - pointer to the technician object + double discountPercentage - discount applied to the booking +Return type: Constructor +*/ ServiceBooking::ServiceBooking( const std::string& id, util::ServiceJobStatus status, @@ -35,111 +67,243 @@ ServiceBooking::ServiceBooking( { } +/* +Function: getId +Description: Retrieves the unique identifier of the service booking. +Parameter: None +Return type: const std::string& +*/ const std::string& ServiceBooking::getId() const { return m_id; } +/* +Function: getStatus +Description: Retrieves the current status of the service booking. +Parameter: None +Return type: util::ServiceJobStatus +*/ util::ServiceJobStatus ServiceBooking::getStatus() const { return m_status; } +/* +Function: getServices +Description: Retrieves the services associated with the booking. +Parameter: None +Return type: const util::Map& +*/ const util::Map& ServiceBooking::getServices() const { return m_services; } +/* +Function: getCustomerId +Description: Retrieves the customer ID associated with the booking. +Parameter: None +Return type: const std::string& +*/ const std::string& ServiceBooking::getCustomerId() const { return m_customerId; } +/* +Function: getCustomer +Description: Retrieves the customer object associated with the booking. +Parameter: None +Return type: User* +*/ User* ServiceBooking::getCustomer() const { return m_customer; } +/* +Function: getVehicleNumber +Description: Retrieves the vehicle registration number for the booking. +Parameter: None +Return type: const std::string& +*/ const std::string& ServiceBooking::getVehicleNumber() const { return m_vehicleNumber; } +/* +Function: getVehicleBrand +Description: Retrieves the brand of the vehicle for the booking. +Parameter: None +Return type: const std::string& +*/ const std::string& ServiceBooking::getVehicleBrand() const { return m_vehicleBrand; } +/* +Function: getVehicleModel +Description: Retrieves the model of the vehicle for the booking. +Parameter: None +Return type: const std::string& +*/ const std::string& ServiceBooking::getVehicleModel() const { return m_vehicleModel; } +/* +Function: getAssignedTechnicianId +Description: Retrieves the ID of the technician assigned to the booking. +Parameter: None +Return type: const std::string& +*/ const std::string& ServiceBooking::getAssignedTechnicianId() const { return m_assignedTechnicianId; } +/* +Function: getAssignedTechnician +Description: Retrieves the technician object assigned to the booking. +Parameter: None +Return type: User* +*/ User* ServiceBooking::getAssignedTechnician() const { return m_assignedTechnician; } +/* +Function: getDiscountPercentage +Description: Retrieves the discount percentage applied to the booking. +Parameter: None +Return type: double +*/ double ServiceBooking::getDiscountPercentage() const { return m_discountPercentage; } +/* +Function: setId +Description: Sets the unique identifier of the service booking. +Parameter: const std::string& id - new booking ID +Return type: void +*/ void ServiceBooking::setId(const std::string& id) { m_id = id; } +/* +Function: setStatus +Description: Sets the current status of the service booking. +Parameter: const util::ServiceJobStatus& status - new booking status +Return type: void +*/ void ServiceBooking::setStatus(const util::ServiceJobStatus& status) { m_status = status; } +/* +Function: setServices +Description: Sets the services associated with the booking. +Parameter: const util::Map& services - new services map +Return type: void +*/ void ServiceBooking::setServices(const util::Map& services) { m_services = services; } +/* +Function: setCustomerId +Description: Sets the customer ID for the booking. +Parameter: const std::string& customerId - new customer ID +Return type: void +*/ void ServiceBooking::setCustomerId(const std::string& customerId) { m_customerId = customerId; } +/* +Function: setCustomer +Description: Sets the customer object for the booking. +Parameter: User* customer - pointer to the customer object +Return type: void +*/ void ServiceBooking::setCustomer(User* customer) { m_customer = customer; } +/* +Function: setVehicleNumber +Description: Sets the vehicle registration number for the booking. +Parameter: const std::string& vehicleNumber - new vehicle number +Return type: void +*/ void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber) { m_vehicleNumber = vehicleNumber; } +/* +Function: setVehicleBrand +Description: Sets the brand of the vehicle for the booking. +Parameter: const std::string& vehicleBrand - new vehicle brand +Return type: void +*/ void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand) { m_vehicleBrand = vehicleBrand; } +/* +Function: setVehicleModel +Description: Sets the model of the vehicle for the booking. +Parameter: const std::string& vehicleModel - new vehicle model +Return type: void +*/ void ServiceBooking::setVehicleModel(const std::string& vehicleModel) { m_vehicleModel = vehicleModel; } +/* +Function: setAssignedTechnicianId +Description: Sets the ID of the technician assigned to the booking. +Parameter: const std::string& assignedTechnicianId - new technician ID +Return type: void +*/ void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnicianId) { m_assignedTechnicianId = assignedTechnicianId; } +/* +Function: setAssignedTechnician +Description: Sets the technician object assigned to the booking. +Parameter: User* assignedTechnician - pointer to the technician object +Return type: void +*/ void ServiceBooking::setAssignedTechnician(User* assignedTechnician) { m_assignedTechnician = assignedTechnician; } +/* +Function: setDiscountPercentage +Description: Sets the discount percentage for the booking. +Parameter: double discountPercentage - new discount percentage +Return type: void +*/ void ServiceBooking::setDiscountPercentage(double discountPercentage) { m_discountPercentage = discountPercentage; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h index f5b96cd..12b63d1 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h @@ -1,3 +1,11 @@ +/* +File: ServiceBooking.h +Description: Header file declaring the ServiceBooking class, which represents + a booking of services by a customer, including vehicle details, + assigned technician, and discount information. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp index 1754358..f844e95 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp @@ -1,13 +1,35 @@ +/* +File: AuthenticationManagementService.cpp +Description: Implementation file containing the method definitions of the + AuthenticationManagementService class, including logout and + password change logic. +Author: Trenser +Date:19-May-2026 +*/ #include "AuthenticationManagementService.h" #include "User.h" User* AuthenticationManagementService::m_authenticatedUser = nullptr; +/* +Function: logout +Description: Logs out the currently authenticated user by clearing the + static authenticated user pointer. +Parameter: None +Return type: void +*/ void AuthenticationManagementService::logout() { m_authenticatedUser = nullptr; } +/* +Function: changePassword +Description: Changes the password of the currently authenticated user. + Throws an exception if no user is logged in. +Parameter: const std::string& newPassword - new password to set +Return type: void +*/ void AuthenticationManagementService::changePassword(const std::string& newPassword) { if (m_authenticatedUser == nullptr) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h index ee0ed91..e89e0c3 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h @@ -1,3 +1,11 @@ +/* +File: AuthenticationManagementService.h +Description: Header file declaring the AuthenticationManagementService class, which manages + user authentication, login, logout, password changes, and retrieval of the + authenticated user. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "DataStore.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 66dd114..9a96815 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -1,3 +1,11 @@ +/* +File: ServiceManagementService.cpp +Description: Implementation file containing the method definitions of the + ServiceManagementService class, including service booking cancellation, + job card management, combo package creation, and removal logic. +Author: Trenser +Date:19-May-2026 +*/ #include "ServiceManagementService.h" #include "DataStore.h" #include "ServiceBooking.h" @@ -7,6 +15,14 @@ #include "Factory.h" #include "ComboPackage.h" +/* +Function: cancelCustomerServiceBookings +Description: Cancels all service bookings associated with a given customer or technician. + Updates booking status, resets customer/technician assignments, sends notifications, + and restocks inventory items. +Parameter: const std::string& userID - ID of the customer or technician +Return type: void +*/ void ServiceManagementService::cancelCustomerServiceBookings(const std::string& userID) { const int INCREMENT_VALUE = 1; @@ -69,7 +85,13 @@ void ServiceManagementService::cancelCustomerServiceBookings(const std::string& } } - +/* +Function: cancelTechnicianJobs +Description: Cancels all jobs assigned to a technician. Updates job status, sends notifications, + and restocks inventory items used in the service. +Parameter: const std::string& technicianID - ID of the technician +Return type: void +*/ void ServiceManagementService::cancelTechnicianJobs(const std::string& technicianID) { const int INCREMENT_VALUE = 1; @@ -101,6 +123,15 @@ void ServiceManagementService::cancelTechnicianJobs(const std::string& technicia } } +/* +Function: createComboPackage +Description: Creates a new combo package with two services and a discount percentage. + Validates service IDs, ensures uniqueness, and inserts the new package into the DataStore. +Parameter: const std::string& packageName - name of the combo package + const util::Vector& serviceIDsInNewCombo - list of service IDs + double discountPercentage - discount percentage for the package +Return type: void +*/ void ServiceManagementService::createComboPackage(const std::string& packageName, const util::Vector& serviceIDsInNewCombo, double discountPercentage) { if (packageName.empty()) @@ -162,11 +193,23 @@ void ServiceManagementService::createComboPackage(const std::string& packageName comboPackageMap.insert(newComboPackage->getId(), newComboPackage); } +/* +Function: getComboPackages +Description: Retrieves all combo packages stored in the DataStore. +Parameter: None +Return type: util::Map +*/ util::Map ServiceManagementService::getComboPackages() { return m_dataStore.getComboPackages(); } +/* +Function: removeComboPackage +Description: Removes a combo package by marking it inactive. Throws an exception if the package ID is not found. +Parameter: const std::string& comboPackageID - ID of the combo package +Return type: void +*/ void ServiceManagementService::removeComboPackage(const std::string& comboPackageID) { bool removed = false; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h index 6c8467e..9ecf191 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h @@ -1,3 +1,11 @@ +/* +File: ServiceManagementService.h +Description: Header file declaring the ServiceManagementService class, which manages + services, combo packages, job cards, and service bookings. Inherits from + NotificationManagementService to handle notifications. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp index 4e26942..ac7fc79 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp @@ -1,11 +1,30 @@ +/* +File: UserManagementService.cpp +Description: Implementation file containing the method definitions of the + UserManagementService class, including user retrieval and removal logic. +Author: Trenser +Date:19-May-2026 +*/ #include "UserManagementService.h" #include "User.h" +/* +Function: getUsers +Description: Retrieves all users stored in the DataStore. +Parameter: None +Return type: util::Map +*/ util::Map UserManagementService::getUsers() { return m_dataStore.getUsers(); } +/* +Function: getUser +Description: Retrieves a specific user by ID from the DataStore. +Parameter: const std::string& userID - ID of the user +Return type: User* +*/ User* UserManagementService::getUser(const std::string& userID) { int index = m_dataStore.getUsers().find(userID); @@ -16,6 +35,12 @@ User* UserManagementService::getUser(const std::string& userID) return nullptr; } +/* +Function: removeUser +Description: Marks a user as inactive in the DataStore instead of deleting them. +Parameter: const std::string& userID - ID of the user to remove +Return type: void +*/ void UserManagementService::removeUser(const std::string& userID) { int index = m_dataStore.getUsers().find(userID); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h index bb7a85a..64f5178 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h @@ -1,3 +1,10 @@ +/* +File: UserManagementService.h +Description: Header file declaring the UserManagementService class, which manages + user creation, updates, retrieval, removal, and notification handling. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include #include "Map.h" @@ -13,7 +20,7 @@ private: DataStore& m_dataStore; public: UserManagementService() : m_dataStore(DataStore::getInstance()) {} - void createUser(const std::string& username, const std::string& password, const std::string& email, const std::string& phone, util::UserType type); + void createUser(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phone, util::UserType type); void updateUserDetails(const std::string& userID, const std::string& email, const std::string& phone); util::Map getUsers(); util::Map getUsers(util::UserType type); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h index 0450c75..ebf0a52 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h @@ -1,7 +1,21 @@ +/* +File: Utility.h +Description: Header file declaring utility functions used across the system, + including cost calculation for services based on required inventory items. +Author: Trenser +Date:19-May-2026 +*/ #pragma once #include "Service.h" #include "InventoryItem.h" +/* +Function: calculatePartsCost +Description: Calculates the total cost of parts required for a given service + by summing the prices of all associated inventory items. +Parameter: const Service* service - pointer to the service object +Return type: double - total cost of required parts +*/ inline double calculatePartsCost(const Service* service) { double cost = 0; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index f2f18de..57e26a3 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -1,3 +1,11 @@ +/* +File: AdminMenu.cpp +Description: Implementation file containing the method definitions of the + AdminMenu class, including menu handling, inventory operations, + user management, and combo package management functions. +Author: Trenser +Date:19-May-2026 +*/ #include #include #include "AdminMenu.h" @@ -10,6 +18,12 @@ #include "ComboPackage.h" #include "Enums.h" +/* +Function: showMenu +Description: Displays the admin menu and handles user input until logout is selected. +Parameter: None +Return type: void +*/ void AdminMenu::showMenu() { while (true) @@ -48,6 +62,12 @@ void AdminMenu::showMenu() } } +/* +Function: handleOperation +Description: Executes the corresponding admin operation based on the selected menu choice. +Parameter: int choice - selected menu option +Return type: bool - true if menu continues, false if logout +*/ bool AdminMenu::handleOperation(int choice) { switch (choice) @@ -101,12 +121,22 @@ bool AdminMenu::handleOperation(int choice) return true; } - +/* +Function: logout +Description: Logs out the currently authenticated admin user. +Parameter: None +Return type: void +*/ void AdminMenu::logout() { m_controller.logout(); } - +/* +Function: changePassword +Description: Allows the admin to change their password after validation. +Parameter: None +Return type: void +*/ void AdminMenu::changePassword() { std::string newPassword; @@ -156,13 +186,21 @@ void AdminMenu::removeService() { } +/* +Function: addTechnician +Description: Adds a new technician after validating username, password, email, and phone number. +Parameter: None +Return type: void +*/ void AdminMenu::addTechnician() { util::clear(); - std::string username, password, email, phoneNumber; - std::cout << std::left << std::setw(25) << "Enter Technician Username:"; + std::string username, name, password, email, phoneNumber; + std::cout << std::left << std::setw(25) << "Enter Technician Username: "; util::read(username); - std::cout << std::setw(25) << "Enter Technician Password:"; + std::cout << std::left << std::setw(25) << "Enter Technician Name: "; + util::read(name); + std::cout << std::setw(25) << "Enter Technician Password: "; util::read(password); if(!util::isPasswordValid(password)) { @@ -170,7 +208,7 @@ void AdminMenu::addTechnician() util::pressEnter(); return; } - std::cout << std::setw(25) << "Enter Technician Email:"; + std::cout << std::setw(25) << "Enter Technician Email: "; util::read(email); if(!util::isEmailValid(email)) { @@ -178,7 +216,7 @@ void AdminMenu::addTechnician() util::pressEnter(); return; } - std::cout << std::setw(25) << "Enter Technician Phone:"; + std::cout << std::setw(25) << "Enter Technician Phone: "; util::read(phoneNumber); if(!util::isPhoneNumberValid(phoneNumber)) { @@ -186,11 +224,17 @@ void AdminMenu::addTechnician() util::pressEnter(); return; } - m_controller.createTechnician(username, password, email, phoneNumber); + m_controller.createTechnician(username, name, password, email, phoneNumber); std::cout << "\nTechnician Added Successfully.\n"; util::pressEnter(); } +/* +Function: filterActiveUsers +Description: Filters out inactive users and returns a map of active users. +Parameter: const util::Map& listOfUsers - all users +Return type: util::Map +*/ static util::Map filterActiveUsers(const util::Map& listOfUsers) { @@ -207,6 +251,13 @@ filterActiveUsers(const util::Map& listOfUsers) return activeUsers; } +/* +Function: displayAllActiveUsers +Description: Displays all active users in a tabular format with index, ID, username, and type. +Parameter: util::Map& activeUsers - active users list + int activeUserCount - number of active users +Return type: void +*/ static void displayAllActiveUsers(util::Map& activeUsers, int activeUserCount) { std::cout << std::left << std::setw(10) << "Index" @@ -234,6 +285,12 @@ static void displayAllActiveUsers(util::Map& activeUse } } +/* +Function: removeUser +Description: Removes a selected active user (customer or technician) from the system. +Parameter: None +Return type: void +*/ void AdminMenu::removeUser() { util::clear(); @@ -266,6 +323,12 @@ void AdminMenu::removeUser() util::pressEnter(); } +/* +Function: selectServiceFromServices +Description: Displays active services and allows the admin to select one by index. +Parameter: const util::Map& services - list of services +Return type: const Service* - selected service +*/ static const Service* selectServiceFromServices(const util::Map& services) { util::Map activeServicesMap; @@ -309,6 +372,12 @@ static const Service* selectServiceFromServices(const util::Map& currentComboPackageIndexMap - combo packages map +Return type: void +*/ static void displayComboPackagesWithIndex(util::Map& currentComboPackageIndexMap) { for (int iterator = 0; iterator < currentComboPackageIndexMap.getSize(); iterator++) @@ -371,6 +446,12 @@ static void displayComboPackagesWithIndex(util::Map& c } } +/* +Function: selectComboPackage +Description: Allows the admin to select an active combo package by index. +Parameter: util::Map& currentComboPackages - combo packages list +Return type: std::string - ID of the selected combo package +*/ static std::string selectComboPackage(util::Map& currentComboPackages) { util::Map currentComboPackageIndexMap; @@ -407,6 +488,12 @@ static std::string selectComboPackage(util::Map Date: Mon, 25 May 2026 17:18:37 +0530 Subject: [PATCH 15/15] Fix PR review comments and refactor menu helper logic Changes: - Added missing include for MenuHelper.h in project and AdminMenu - Fixed typo in variable name inventoryIems to inventoryItems in Controller.cpp - Removed stray semicolon from include in Controller.h - Cleaned up duplicate comments in Controller.cpp description header - Minor formatting adjustments with blank lines after headers in multiple files - Updated ServiceManagementService notification message to remove informal wording - Refactored AdminMenu::changePassword to use changePasswordHelper - Added util::clear() call at start of viewStockLevels - Removed redundant helper functions from AdminMenu.cpp and moved to shared helpers - Fixed bug in removeInventoryItem to use activeItems instead of inventoryItems - Enhanced createComboPackages to enforce selection of two distinct services - General comment cleanup and formatting consistency across headers and implementation files --- .../Trenser.VehicleServiceSystem.vcxproj | 1 + .../controllers/Controller.cpp | 12 +- .../controllers/Controller.h | 3 +- .../models/JobCard.cpp | 1 + .../models/JobCard.h | 1 + .../models/ServiceBooking.cpp | 1 + .../models/ServiceBooking.h | 1 + .../AuthenticationManagementService.cpp | 1 + .../AuthenticationManagementService.h | 1 + .../services/InventoryManagementService.cpp | 1 + .../services/InventoryManagementService.h | 1 + .../services/ServiceManagementService.cpp | 13 +- .../services/ServiceManagementService.h | 1 + .../services/UserManagementService.cpp | 1 + .../services/UserManagementService.h | 1 + .../utilities/Utility.h | 1 + .../views/AdminMenu.cpp | 347 ++---------------- .../views/AdminMenu.h | 1 + .../views/MenuHelper.h | 333 +++++++++++++++++ .../views/TechnicianMenu.cpp | 20 +- .../views/TechnicianMenu.h | 1 + .../views/UserInterface.cpp | 1 + .../views/UserInterface.h | 1 + 23 files changed, 404 insertions(+), 341 deletions(-) create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj index 819264c..fd7c056 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj @@ -181,6 +181,7 @@ + diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index a9ca314..8e5f329 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -2,13 +2,11 @@ File: Controller.cpp Description: Implementation file containing the method definitions of the Controller class, which manages authentication, users, services, - combo packages, and inventory operations. - Implementation file containing the method definitions - of the Controller class, which manages user authentication, - inventory, services, bookings, and notifications. + combo packages, bookings, notifications and inventory operations. Author: Trenser Date:19-May-2026 */ + #include "Controller.h" #include "ComboPackage.h" #include "User.h" @@ -121,12 +119,12 @@ Return type: util::Map */ util::Map Controller::getInventoryItems() { - auto inventoryIems = m_inventoryManagementService.getInventoryItems(); + auto inventoryItems = m_inventoryManagementService.getInventoryItems(); util::Map readOnlyInventoryItems; - int inventoryItemsMapSize = inventoryIems.getSize(); + int inventoryItemsMapSize = inventoryItems.getSize(); for (int index = 0; index < inventoryItemsMapSize; index++) { - readOnlyInventoryItems.insert(inventoryIems.getKeyAt(index), inventoryIems.getValueAt(index)); + readOnlyInventoryItems.insert(inventoryItems.getKeyAt(index), inventoryItems.getValueAt(index)); } return readOnlyInventoryItems; } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index 5ef67d3..43fbf09 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -6,6 +6,7 @@ Description: Header file declaring the Controller class, which manages Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "Map.h" @@ -13,7 +14,7 @@ Date:19-May-2026 #include "UserManagementService.h" #include "ServiceManagementService.h" #include "AuthenticationManagementService.h" -#include "InventoryManagementService.h"; +#include "InventoryManagementService.h" class Service; class ComboPackage; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp index 7e441f2..b0e131a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "JobCard.h" int JobCard::m_uid = 0; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h index 91cb0e5..21525a9 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h @@ -6,6 +6,7 @@ Description: Header file declaring the JobCard class, which represents Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "Timestamp.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp index 5b843bc..f4a2be9 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "ServiceBooking.h" int ServiceBooking::m_uid = 0; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h index 12b63d1..b426d3e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h @@ -6,6 +6,7 @@ Description: Header file declaring the ServiceBooking class, which represents Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp index f844e95..7f72bd1 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "AuthenticationManagementService.h" #include "User.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h index e89e0c3..47266a1 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.h @@ -6,6 +6,7 @@ Description: Header file declaring the AuthenticationManagementService class, wh Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "DataStore.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index ef48930..54a76f0 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "InventoryManagementService.h" #include "InventoryItem.h" #include "Factory.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h index e7c549c..6fb27ec 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h @@ -6,6 +6,7 @@ Description: Header file declaring the InventoryManagementService class, Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 9a96815..f4c12e0 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "ServiceManagementService.h" #include "DataStore.h" #include "ServiceBooking.h" @@ -54,12 +55,16 @@ void ServiceManagementService::cancelCustomerServiceBookings(const std::string& booking->setCustomer(nullptr); booking->setCustomerId(""); User* assignedTechnician = booking->getAssignedTechnician(); - sendNotification(assignedTechnician, "Customer Service Cancelled", "Uh?Oh. The customer has cancelled their service booking. Your assigned job card has been cancelled and the inventory has been restocked."); + std::string title = "Customer Service Cancelled"; + std::string message = "The customer has cancelled their service booking. Your assigned job card has been cancelled and the inventory has been restocked."; + sendNotification(assignedTechnician, title, message); } else if (type == util::UserType::TECHNICIAN) { booking->setStatus(util::ServiceJobStatus::PENDING); - sendNotification(booking->getCustomer(), "Technician Unavailable", "Your assigned technician is no longer available. Your booking has been reset to pending, and we will reassign a new technician shortly."); + std::string title = "Technician Unavailable"; + std::string message = "Your assigned technician is no longer available. Your booking has been reset to pending, and we will reassign a new technician shortly."; + sendNotification(booking->getCustomer(), title, message); } booking->setAssignedTechnician(nullptr); booking->setAssignedTechnicianId(""); @@ -104,7 +109,9 @@ void ServiceManagementService::cancelTechnicianJobs(const std::string& technicia if (job->getStatus() == util::ServiceJobStatus::PENDING || job->getStatus() == util::ServiceJobStatus::STARTED) { job->setStatus(util::ServiceJobStatus::CANCELLED); - sendNotification(job->getTechnician(), "Job Cancelled", "The Job has cancelled. Your job card has been cancelled and the inventory has been restocked."); + std::string title = "Job Cancelled"; + std::string message = "The Job has cancelled. Your job card has been cancelled and the inventory has been restocked."; + sendNotification(job->getTechnician(), title, message); Service* service = job->getService(); if (service != nullptr) { diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h index 9ecf191..879ee54 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h @@ -6,6 +6,7 @@ Description: Header file declaring the ServiceManagementService class, which man Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp index ac7fc79..7e6837b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp @@ -5,6 +5,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "UserManagementService.h" #include "User.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h index 64f5178..b36b926 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h @@ -5,6 +5,7 @@ Description: Header file declaring the UserManagementService class, which manage Author: Trenser Date:19-May-2026 */ + #pragma once #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h index ebf0a52..35fd5ca 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h @@ -5,6 +5,7 @@ Description: Header file declaring utility functions used across the system, Author: Trenser Date:19-May-2026 */ + #pragma once #include "Service.h" #include "InventoryItem.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index c228b70..9d2213e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include #include #include "AdminMenu.h" @@ -18,6 +19,7 @@ Date:19-May-2026 #include "Utility.h" #include "ComboPackage.h" #include "Enums.h" +#include "MenuHelper.h" /* Function: showMenu @@ -132,6 +134,7 @@ void AdminMenu::logout() { m_controller.logout(); } + /* Function: changePassword Description: Allows the admin to change their password after validation. @@ -140,23 +143,7 @@ Return type: void */ void AdminMenu::changePassword() { - std::string newPassword; - while (true) - { - util::clear(); - std::cout << "Enter new password: "; - util::read(newPassword); - if (!util::isPasswordValid(newPassword)) - { - std::cout << "Error: Password is not strong enough!\n"; - util::pressEnter(); - continue; - } - m_controller.changePassword(newPassword); - std::cout << "Password changed successfully\n"; - util::pressEnter(); - break; - } + changePasswordHelper(m_controller); } /* @@ -168,6 +155,7 @@ Return type: void */ void AdminMenu::viewStockLevels() { + util::clear(); auto inventoryItems = m_controller.getInventoryItems(); std::cout << std::left << std::setw(15) << "Item ID" << std::setw(25) << "Part Name" @@ -191,112 +179,6 @@ void AdminMenu::viewStockLevels() } } -/* -Function: filterActiveItems -Description: Filters out inactive inventory items and returns a map - containing only active items. -Parameter: const util::Map& inventoryItems - - map of all inventory items -Return type: util::Map -*/ -static util::Map -filterActiveItems(const util::Map& inventoryItems) -{ - util::Map activeItems; - int inventorySize = inventoryItems.getSize(); - for (int index = 0; index < inventorySize; index++) - { - const InventoryItem* item = inventoryItems.getValueAt(index); - if (item != nullptr && item->getState() != util::State::INACTIVE) - { - activeItems.insert(item->getId(), item); - } - } - return activeItems; -} - -/* -Function: displayInventoryWithItems -Description: Displays inventory items in a tabular format with index, ID, - part name, quantity, and price. -Parameter: util::Map& inventoryItems - - map of inventory items to display -Return type: void -*/ -static void displayInventoryWithItems(util::Map& inventoryItems) -{ - int inventorySize = inventoryItems.getSize(); - std::cout << std::left << std::setw(10) << "Index" - << std::setw(15) << "Item ID" - << std::setw(25) << "Part Name" - << std::setw(10) << "Quantity" - << std::setw(10) << "Price" - << std::endl; - for (int iterator = 0; iterator < inventorySize; iterator++) - { - const InventoryItem* item = inventoryItems.getValueAt(iterator); - if (item != nullptr) - { - std::cout << std::left << std::setw(10) << (iterator + 1) - << std::setw(15) << item->getId() - << std::setw(25) << item->getPartName() - << std::setw(10) << item->getQuantity() - << std::setw(10) << item->getPrice() - << std::endl; - } - } -} - -/* -Function: addQuantityToItem -Description: Allows the admin to select an active inventory item and - increase its stock quantity. -Parameter: util::Map& inventoryItems - - map of inventory items - Controller& m_controller - controller instance to update stock -Return type: void -*/ -static void addQuantityToItem(util::Map& inventoryItems, Controller& m_controller) -{ - int itemIndex; - int quantity; - auto activeItems = filterActiveItems(inventoryItems); - int activeSize = activeItems.getSize(); - if (activeSize == 0) - { - std::cout << "No active items available in Inventory" << std::endl; - return; - } - displayInventoryWithItems(activeItems); - std::cout << "Enter the index of the item to update: "; - util::read(itemIndex); - if (itemIndex < 1 || itemIndex > activeSize) - { - std::cout << "Invalid index selected." << std::endl; - return; - } - std::cout << "Enter quantity to add: "; - util::read(quantity); - if (quantity < 0) - { - std::cout << "The quantity should be Greater than 0." << std::endl; - return; - } - const InventoryItem* selectedItem = activeItems.getValueAt(itemIndex - 1); - if (selectedItem != nullptr) - { - std::string selectedItemId = selectedItem->getId(); - m_controller.addInventoryItemStock(selectedItemId, quantity); - std::cout << "Updated " << selectedItem->getPartName() - << " stock. New quantity: " << selectedItem->getQuantity() - << std::endl; - } - else - { - std::cout << "Error: Selected item could not be found." << std::endl; - } -} - /* Function: addInventoryItem Description: Allows the admin to either add a new inventory item @@ -366,7 +248,7 @@ void AdminMenu::removeInventoryItem() util::pressEnter(); return; } - const InventoryItem* selectedItem = inventoryItems.getValueAt(itemIndex - 1); + const InventoryItem* selectedItem = activeItems.getValueAt(itemIndex - 1); if (selectedItem != nullptr) { if(selectedItem->getState() != util::State::INACTIVE) @@ -462,62 +344,6 @@ void AdminMenu::addTechnician() util::pressEnter(); } -/* -Function: filterActiveUsers -Description: Filters out inactive users and returns a map of active users. -Parameter: const util::Map& listOfUsers - all users -Return type: util::Map -*/ -static util::Map -filterActiveUsers(const util::Map& listOfUsers) -{ - util::Map activeUsers; - int inventorySize = listOfUsers.getSize(); - for (int index = 0; index < inventorySize; index++) - { - const User* user = listOfUsers.getValueAt(index); - if (user != nullptr && user->getState() != util::State::INACTIVE) - { - activeUsers.insert(user->getId(), user); - } - } - return activeUsers; -} - -/* -Function: displayAllActiveUsers -Description: Displays all active users in a tabular format with index, ID, username, and type. -Parameter: util::Map& activeUsers - active users list - int activeUserCount - number of active users -Return type: void -*/ -static void displayAllActiveUsers(util::Map& activeUsers, int activeUserCount) -{ - std::cout << std::left << std::setw(10) << "Index" - << std::setw(15) << "User ID" - << std::setw(25) << "Username" - << std::setw(25) << "User Type" - << std::endl; - for (int iterator = 0; iterator < activeUserCount; iterator++) - { - const User* user = activeUsers.getValueAt(iterator); - if (user != nullptr) - { - std::cout << std::left << std::setw(10) << (iterator + 1) - << std::setw(15) << user->getId() - << std::setw(25) << user->getUserName() - << std::setw(25) << util::getUserTypeString(user->getUserType()) - << std::endl; - } - else - { - std::cout << "No users found.\n"; - util::pressEnter(); - return; - } - } -} - /* Function: removeUser Description: Removes a selected active user (customer or technician) from the system. @@ -556,55 +382,6 @@ void AdminMenu::removeUser() util::pressEnter(); } -/* -Function: selectServiceFromServices -Description: Displays active services and allows the admin to select one by index. -Parameter: const util::Map& services - list of services -Return type: const Service* - selected service -*/ -static const Service* selectServiceFromServices(const util::Map& services) -{ - util::Map activeServicesMap; - int currentIndex = 1; - int userInputIndex; - std::cout << std::left - << std::setw(10) << "Index" - << std::setw(15) << "Service ID" - << std::setw(25) << "Service Name" - << std::setw(15) << "Estimated Cost" - << std::endl; - for (int index = 0; index < services.getSize(); index++) - { - const Service* currentService = services.getValueAt(index); - if (currentService->getState() != util::State::ACTIVE) - { - continue; - } - activeServicesMap.insert(currentIndex, currentService); - double partsCost = calculatePartsCost(currentService); - std::cout << std::left - << std::setw(10) << currentIndex - << std::setw(15) << currentService->getId() - << std::setw(25) << currentService->getName() - << std::setw(15) << (currentService->getLaborCost() + partsCost) - << std::endl; - currentIndex++; - } - if (activeServicesMap.getSize() == 0) - { - std::cout << "No active services available." << std::endl; - return nullptr; - } - std::cout << "Enter service index: "; - util::read(userInputIndex); - if (activeServicesMap.find(userInputIndex) == -1) - { - std::cout << "Invalid service index." << std::endl; - return nullptr; - } - return activeServicesMap[userInputIndex]; -} - /* Function: createComboPackages Description: Creates a new combo package by selecting two active services and applying a discount. @@ -615,19 +392,38 @@ void AdminMenu::createComboPackages() { util::clear(); auto serviceList = m_controller.getServices(); - const int numberOfServicesInPackage = 2; + const int NUMBER_OF_SERVICE_PER_PACKAGE = 2; util::Vector selectedServiceID; - for (int iterator = 0; iterator < numberOfServicesInPackage; iterator++) + for (int iterator = 0; iterator < NUMBER_OF_SERVICE_PER_PACKAGE; iterator++) { - const Service* chosenService = selectServiceFromServices(serviceList); - if (chosenService == nullptr) + const Service* chosenService = nullptr; + while (true) { - std::cout << "Failed to create combo package!"; - util::pressEnter(); - return; + chosenService = selectServiceFromServices(serviceList); + if (chosenService == nullptr) + { + std::cout << "Failed to create combo package!"; + util::pressEnter(); + return; + } + bool alreadyChosen = false; + for (int iteratorOne = 0; iteratorOne < selectedServiceID.getSize(); iteratorOne++) + { + if (selectedServiceID[iteratorOne] == chosenService->getId()) + { + alreadyChosen = true; + break; + } + } + if (alreadyChosen) + { + std::cout << "Service already selected. Please choose a different one." << std::endl; + continue; + } + selectedServiceID.push_back(chosenService->getId()); + util::clear(); + break; } - selectedServiceID.push_back(chosenService->getId()); - util::clear(); } std::string packageName; double discountPercentage; @@ -646,81 +442,6 @@ void AdminMenu::createComboPackages() util::pressEnter(); } -/* -Function: displayComboPackagesWithIndex -Description: Displays combo packages with index, ID, name, and discount percentage. -Parameter: util::Map& currentComboPackageIndexMap - combo packages map -Return type: void -*/ -static void displayComboPackagesWithIndex(util::Map& currentComboPackageIndexMap) -{ - for (int iterator = 0; iterator < currentComboPackageIndexMap.getSize(); iterator++) - { - const ComboPackage* currentComboPackage = currentComboPackageIndexMap.getValueAt(iterator); - if (currentComboPackage == nullptr) - { - throw std::runtime_error("Error accessing the combopackage.\n"); - } - if (iterator == 0) - { - std::cout << std::left - << std::setw(8) << "Index" - << std::setw(10) << "ID" - << std::setw(20) << "Package Name" - << std::setw(15) << "Discount (%)" - << "\n"; - } - std::cout << std::left - << std::setw(8) << currentComboPackageIndexMap.getKeyAt(iterator) - << std::setw(10) << currentComboPackage->getId() - << std::setw(20) << currentComboPackage->getPackageName() - << std::setw(15) << currentComboPackage->getDiscountPercentage() - << "\n"; - } -} - -/* -Function: selectComboPackage -Description: Allows the admin to select an active combo package by index. -Parameter: util::Map& currentComboPackages - combo packages list -Return type: std::string - ID of the selected combo package -*/ -static std::string selectComboPackage(util::Map& currentComboPackages) -{ - util::Map currentComboPackageIndexMap; - if (currentComboPackages.getSize() == 0) - { - throw std::runtime_error("No combo packages are available.\n"); - } - int currentIndex = 1, choice, selectedIndex; - for (int iterator = 0; iterator < currentComboPackages.getSize(); iterator++) - { - if (currentComboPackages.getValueAt(iterator)->getState() == util::State::INACTIVE) - { - continue; - } - currentComboPackageIndexMap.insert(currentIndex++, currentComboPackages.getValueAt(iterator)); - } - if (currentComboPackageIndexMap.getSize() == 0) - { - throw std::runtime_error("No combo packages currently active."); - } - displayComboPackagesWithIndex(currentComboPackageIndexMap); - std::cout << "Enter your choice(Index): "; - util::read(choice); - selectedIndex = currentComboPackageIndexMap.find(choice); - if (selectedIndex != -1) - { - std::string selectedComboPackageID = currentComboPackageIndexMap.getValueAt(selectedIndex)->getId(); - return selectedComboPackageID; - } - else - { - std::cout << "Enter a valid choice.\n"; - return ""; - } -} - /* Function: removeComboPackage Description: Removes a selected combo package from the system. diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h index d65b720..8b1b31f 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h @@ -6,6 +6,7 @@ Description: Header file declaring the AdminMenu class, which provides Author: Trenser Date:19-May-2026 */ + #pragma once #include "Controller.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h new file mode 100644 index 0000000..25be578 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h @@ -0,0 +1,333 @@ +/* +File: MenuHelper.h +Description: Header file declaring the MenuHelper class, which provides + utility functions for menu-driven operations such as + notification selection and display. +Author: Trenser +Date: 21-May-2026 +*/ + +#pragma once +#include +#include +#include +#include "Utility.h" +#include "Controller.h" +#include "ComboPackage.h" + +/* +Function: filterActiveItems +Description: Filters out inactive inventory items and returns a map + containing only active items. +Parameter: const util::Map& inventoryItems - + map of all inventory items +Return type: util::Map +*/ +inline util::Map filterActiveItems(const util::Map& inventoryItems) +{ + util::Map activeItems; + int inventorySize = inventoryItems.getSize(); + for (int index = 0; index < inventorySize; index++) + { + const InventoryItem* item = inventoryItems.getValueAt(index); + if (item != nullptr && item->getState() != util::State::INACTIVE) + { + activeItems.insert(item->getId(), item); + } + } + return activeItems; +} + +/* +Function: displayInventoryWithItems +Description: Displays inventory items in a tabular format with index, ID, + part name, quantity, and price. +Parameter: util::Map& inventoryItems - + map of inventory items to display +Return type: void +*/ +inline void displayInventoryWithItems(util::Map& inventoryItems) +{ + int inventorySize = inventoryItems.getSize(); + std::cout << std::left << std::setw(10) << "Index" + << std::setw(15) << "Item ID" + << std::setw(25) << "Part Name" + << std::setw(10) << "Quantity" + << std::setw(10) << "Price" + << std::endl; + for (int iterator = 0; iterator < inventorySize; iterator++) + { + const InventoryItem* item = inventoryItems.getValueAt(iterator); + if (item != nullptr) + { + std::cout << std::left << std::setw(10) << (iterator + 1) + << std::setw(15) << item->getId() + << std::setw(25) << item->getPartName() + << std::setw(10) << item->getQuantity() + << std::setw(10) << item->getPrice() + << std::endl; + } + } +} + +/* +Function: addQuantityToItem +Description: Allows the admin to select an active inventory item and + increase its stock quantity. +Parameter: util::Map& inventoryItems - + map of inventory items + Controller& m_controller - controller instance to update stock +Return type: void +*/ +inline void addQuantityToItem(util::Map& inventoryItems, Controller& m_controller) +{ + int itemIndex; + int quantity; + auto activeItems = filterActiveItems(inventoryItems); + int activeSize = activeItems.getSize(); + if (activeSize == 0) + { + std::cout << "No active items available in Inventory" << std::endl; + return; + } + displayInventoryWithItems(activeItems); + std::cout << "Enter the index of the item to update: "; + util::read(itemIndex); + if (itemIndex < 1 || itemIndex > activeSize) + { + std::cout << "Invalid index selected." << std::endl; + return; + } + std::cout << "Enter quantity to add: "; + util::read(quantity); + if (quantity < 0) + { + std::cout << "The quantity should be Greater than 0." << std::endl; + return; + } + const InventoryItem* selectedItem = activeItems.getValueAt(itemIndex - 1); + if (selectedItem != nullptr) + { + std::string selectedItemId = selectedItem->getId(); + m_controller.addInventoryItemStock(selectedItemId, quantity); + std::cout << "Updated " << selectedItem->getPartName() + << " stock. New quantity: " << selectedItem->getQuantity() + << std::endl; + } + else + { + std::cout << "Error: Selected item could not be found." << std::endl; + } +} + +/* +Function: changePassword +Description: Allows the admin to change their password after validation. +Parameter: None +Return type: void +*/ +inline void changePasswordHelper(Controller& controller) +{ + util::clear(); + std::string newPassword; + while (true) + { + util::clear(); + std::cout << "Enter new password: "; + util::read(newPassword); + if (!util::isPasswordValid(newPassword)) + { + std::cout << "Error: Password is not strong enough!\n"; + util::pressEnter(); + continue; + } + controller.changePassword(newPassword); + std::cout << "Password changed successfully\n"; + util::pressEnter(); + break; + } +} + +/* +Function: filterActiveUsers +Description: Filters out inactive users and returns a map of active users. +Parameter: const util::Map& listOfUsers - all users +Return type: util::Map +*/ +inline util::Map filterActiveUsers(const util::Map& listOfUsers) +{ + util::Map activeUsers; + int inventorySize = listOfUsers.getSize(); + for (int index = 0; index < inventorySize; index++) + { + const User* user = listOfUsers.getValueAt(index); + if (user != nullptr && user->getState() != util::State::INACTIVE) + { + activeUsers.insert(user->getId(), user); + } + } + return activeUsers; +} + +/* +Function: displayAllActiveUsers +Description: Displays all active users in a tabular format with index, ID, username, and type. +Parameter: util::Map& activeUsers - active users list + int activeUserCount - number of active users +Return type: void +*/ +inline void displayAllActiveUsers(util::Map& activeUsers, int activeUserCount) +{ + std::cout << std::left << std::setw(10) << "Index" + << std::setw(15) << "User ID" + << std::setw(25) << "Username" + << std::setw(25) << "User Type" + << std::endl; + for (int iterator = 0; iterator < activeUserCount; iterator++) + { + const User* user = activeUsers.getValueAt(iterator); + if (user != nullptr) + { + std::cout << std::left << std::setw(10) << (iterator + 1) + << std::setw(15) << user->getId() + << std::setw(25) << user->getUserName() + << std::setw(25) << util::getUserTypeString(user->getUserType()) + << std::endl; + } + else + { + std::cout << "No users found.\n"; + util::pressEnter(); + return; + } + } +} + +/* +Function: selectServiceFromServices +Description: Displays active services and allows the admin to select one by index. +Parameter: const util::Map& services - list of services +Return type: const Service* - selected service +*/ +inline const Service* selectServiceFromServices(const util::Map& services) +{ + util::Map activeServicesMap; + int currentIndex = 1; + int userInputIndex; + std::cout << std::left + << std::setw(10) << "Index" + << std::setw(15) << "Service ID" + << std::setw(25) << "Service Name" + << std::setw(15) << "Estimated Cost" + << std::endl; + for (int index = 0; index < services.getSize(); index++) + { + const Service* currentService = services.getValueAt(index); + if (currentService == nullptr) + { + throw std::runtime_error("Warning: Encountered a null service\n"); + continue; + } + if (currentService->getState() != util::State::ACTIVE) + { + continue; + } + activeServicesMap.insert(currentIndex, currentService); + double partsCost = calculatePartsCost(currentService); + std::cout << std::left + << std::setw(10) << currentIndex + << std::setw(15) << currentService->getId() + << std::setw(25) << currentService->getName() + << std::setw(15) << (currentService->getLaborCost() + partsCost) + << std::endl; + currentIndex++; + } + if (activeServicesMap.getSize() == 0) + { + std::cout << "No active services available." << std::endl; + return nullptr; + } + std::cout << "Enter service index: "; + util::read(userInputIndex); + if (activeServicesMap.find(userInputIndex) == -1) + { + std::cout << "Invalid service index." << std::endl; + return nullptr; + } + return activeServicesMap[userInputIndex]; +} + +/* +Function: displayComboPackagesWithIndex +Description: Displays combo packages with index, ID, name, and discount percentage. +Parameter: util::Map& currentComboPackageIndexMap - combo packages map +Return type: void +*/ +inline void displayComboPackagesWithIndex(util::Map& currentComboPackageIndexMap) +{ + for (int iterator = 0; iterator < currentComboPackageIndexMap.getSize(); iterator++) + { + const ComboPackage* currentComboPackage = currentComboPackageIndexMap.getValueAt(iterator); + if (currentComboPackage == nullptr) + { + throw std::runtime_error("Error accessing the combopackage.\n"); + } + if (iterator == 0) + { + std::cout << std::left + << std::setw(8) << "Index" + << std::setw(10) << "ID" + << std::setw(20) << "Package Name" + << std::setw(15) << "Discount (%)" + << "\n"; + } + std::cout << std::left + << std::setw(8) << currentComboPackageIndexMap.getKeyAt(iterator) + << std::setw(10) << currentComboPackage->getId() + << std::setw(20) << currentComboPackage->getPackageName() + << std::setw(15) << currentComboPackage->getDiscountPercentage() + << "\n"; + } +} + +/* +Function: selectComboPackage +Description: Allows the admin to select an active combo package by index. +Parameter: util::Map& currentComboPackages - combo packages list +Return type: std::string - ID of the selected combo package +*/ +inline std::string selectComboPackage(util::Map& currentComboPackages) +{ + util::Map currentComboPackageIndexMap; + if (currentComboPackages.getSize() == 0) + { + throw std::runtime_error("No combo packages are available.\n"); + } + int currentIndex = 1, choice, selectedIndex; + for (int iterator = 0; iterator < currentComboPackages.getSize(); iterator++) + { + if (currentComboPackages.getValueAt(iterator)->getState() == util::State::INACTIVE) + { + continue; + } + currentComboPackageIndexMap.insert(currentIndex++, currentComboPackages.getValueAt(iterator)); + } + if (currentComboPackageIndexMap.getSize() == 0) + { + throw std::runtime_error("No combo packages currently active."); + } + displayComboPackagesWithIndex(currentComboPackageIndexMap); + std::cout << "Enter your choice(Index): "; + util::read(choice); + selectedIndex = currentComboPackageIndexMap.find(choice); + if (selectedIndex != -1) + { + std::string selectedComboPackageID = currentComboPackageIndexMap.getValueAt(selectedIndex)->getId(); + return selectedComboPackageID; + } + else + { + std::cout << "Enter a valid choice.\n"; + return ""; + } +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp index 76f951e..44fbcc4 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp @@ -10,6 +10,7 @@ Date:19-May-2026 #include "InputHelper.h" #include "OutputHelper.h" #include "Validator.h" +#include "MenuHelper.h" /* Function: showMenu @@ -100,23 +101,8 @@ Description: Allows the technician to change their password after validation. Parameter: None Return type: void */ + void TechnicianMenu::changePassword() { - std::string newPassword; - while (true) - { - util::clear(); - std::cout << "Enter new password: "; - util::read(newPassword); - if (!util::isPasswordValid(newPassword)) - { - std::cout << "Error: Password is not strong enough!\n"; - util::pressEnter(); - continue; - } - m_controller.changePassword(newPassword); - std::cout << "Password changed successfully\n"; - util::pressEnter(); - break; - } + changePasswordHelper(m_controller); } \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h index df06005..3c7e9ed 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h @@ -6,6 +6,7 @@ Description: Header file declaring the TechnicianMenu class, which provides Author: Trenser Date:19-May-2026 */ + #pragma once #include "Controller.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp index c6e270b..1b5d273 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp @@ -6,6 +6,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include "UserInterface.h" #include "InputHelper.h" #include "OutputHelper.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h index 52c2beb..501cfce 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h @@ -7,6 +7,7 @@ Description: Header file declaring the UserInterface class, which provides Author: Trenser Date:19-May-2026 */ + #pragma once #include "Controller.h" #include "AdminMenu.h"