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()