From ab6eed5ee678181aeceed78b190e9f1855b9299e Mon Sep 17 00:00:00 2001 From: Avinash Rajesh Date: Thu, 21 May 2026 12:44:00 +0530 Subject: [PATCH] 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()