From df769a7528bd0e4dee2ad7a4f4b0c549e2270dd1 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 20:04:25 +0530 Subject: [PATCH 1/9] 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 2/9] 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 3/9] 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 4/9] 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 2bdf0eb7411339a4997b05c24322c1677340b35a Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Wed, 20 May 2026 12:31:54 +0530 Subject: [PATCH 5/9] 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 6/9] 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 7/9] 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 8/9] 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 dd738be4de47fe050cb557a487e256778cdd60a1 Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Fri, 22 May 2026 12:34:11 +0530 Subject: [PATCH 9/9] Add standardized documentation headers --- .../controllers/Controller.cpp | 69 ++++++++ .../controllers/Controller.h | 8 + .../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 | 7 + .../utilities/Utility.h | 14 ++ .../views/AdminMenu.cpp | 89 +++++++++- .../views/AdminMenu.h | 8 + .../views/TechnicianMenu.cpp | 33 ++++ .../views/TechnicianMenu.h | 8 + .../views/UserInterface.cpp | 28 +++ .../views/UserInterface.h | 9 + 19 files changed, 708 insertions(+), 3 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index 28287a7..b25c026 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,6 +48,16 @@ const User* Controller::getAuthenticatedUser() return nullptr; } +/* +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& password, const std::string& email, const std::string& phoneNumber) { m_userManagementService.createUser(username, password, email, phoneNumber, util::UserType::TECHNICIAN); @@ -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..c60330f 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" 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..0926caa 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" 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..50d4677 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,6 +186,12 @@ 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(); @@ -191,6 +227,12 @@ 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) { @@ -207,6 +249,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 +283,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 +321,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 +370,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 +444,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 +486,12 @@ static std::string selectComboPackage(util::Map