diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index acbfdf5..5c3327a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -80,7 +80,7 @@ void InventoryManagementService::sendLowStockAlerts() { throw std::runtime_error("The system has no admins present!"); } - for (int index = 0; index <= inventoryItemsSize; index++) + for (int index = 0; index < inventoryItemsSize; index++) { InventoryItem* inventoryItem = inventoryItems.getValueAt(index); if (inventoryItem && inventoryItem->getQuantity() < config::threshold::INVENTORY_LOW_STOCK_THRESHOLD) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 55920d5..799d701 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -61,7 +61,7 @@ void ServiceManagementService::purchaseService(const util::Vector& Service* service = servicesMap.getValueAt(serviceIndex); selectedServices[service->getId()] = service; } - ServiceBooking* serviceBooking = Factory::getObject(util::ServiceJobStatus::STARTED, selectedServices, authenticatedUser->getId(), authenticatedUser, vehicleNumber, vehicleBrand, vehicleModel, 0); + ServiceBooking* serviceBooking = Factory::getObject(util::ServiceJobStatus::PENDING, selectedServices, authenticatedUser->getId(), authenticatedUser, vehicleNumber, vehicleBrand, vehicleModel, 0); if (serviceBooking == nullptr) { throw std::runtime_error("Failed to create service booking"); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp index 3a2ce96..613a3d2 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp @@ -19,7 +19,7 @@ Date:19-May-2026 #include "User.h" #include "UserManagementService.h" #include "Vector.h" - +#include "Validator.h" /* Function: ensureAdminExists @@ -74,16 +74,18 @@ void UserManagementService::createUser(const std::string& username, const std::s PaymentManagementService paymentManagementService; ServiceManagementService serviceManagementService; auto& usersMap = m_dataStore.getUsers(); - int index = usersMap.findIf( - [&](const std::string&, User* user) - { - return user->getUserName() == username; - } - ); - if (index != -1) + if (util::isUsernameDuplicate(username, usersMap)) { throw std::runtime_error("Username already exists"); } + if (util::isEmailDuplicate(email, usersMap)) + { + throw std::runtime_error("Email already exists"); + } + if (util::isPhoneDuplicate(phone, usersMap)) + { + throw std::runtime_error("Phone already exists"); + } User* newUser = Factory::getObject(username, password, name, phone, email, type); usersMap.insert(newUser->getId(), newUser); paymentManagementService.attach(newUser); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h index e789442..75d8bbc 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h @@ -62,6 +62,7 @@ namespace util */ inline void pressEnter() { + std::cout << std::endl; system("pause"); } } \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.cpp index b2ed37d..cdba432 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.cpp @@ -106,4 +106,37 @@ bool util::isPasswordValid(const std::string& password) } return hasUpper && hasLower && hasDigit && hasSpecial; -} \ No newline at end of file +} + +bool util::isUsernameDuplicate(const std::string& username, const util::Map& usersMap) +{ + int index = usersMap.findIf( + [&](const std::string&, User* user) + { + return (user->getUserName() == username && user->getState() == util::State::ACTIVE); + } + ); + return index != -1; +} + +bool util::isPhoneDuplicate(const std::string& phone, const util::Map& usersMap) +{ + int index = usersMap.findIf( + [&](const std::string&, User* user) + { + return (user->getPhone() == phone && user->getState() == util::State::ACTIVE); + } + ); + return index != -1; +} + +bool util::isEmailDuplicate(const std::string& email, const util::Map& usersMap) +{ + int index = usersMap.findIf( + [&](const std::string&, User* user) + { + return (user->getEmail() == email && user->getState() == util::State::ACTIVE); + } + ); + return index != -1; +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.h index 8602e4e..aa7b526 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Validator.h @@ -9,10 +9,15 @@ #include #include #include +#include "Map.h" +#include "User.h" namespace util { bool isPhoneNumberValid(const std::string&); bool isEmailValid(const std::string&); bool isPasswordValid(const std::string&); + bool isUsernameDuplicate(const std::string&, const util::Map&); + bool isPhoneDuplicate(const std::string&, const util::Map&); + bool isEmailDuplicate(const std::string&, const util::Map&); } \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp index f949200..2f3a0f9 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp @@ -175,9 +175,16 @@ Return type: void void CustomerMenu::selectService() { std::string vehicleNumber, vehicleBrand, vehicleModel; - auto services = m_controller.getServices(); - util::Vector selectedServices; util::clear(); + std::cout << "Select a Service\n"; + auto services = m_controller.getServices(); + if (services.isEmpty()) + { + std::cout << "No services available!"; + util::pressEnter(); + return; + } + util::Vector selectedServices; const Service* selectedService = selectServiceFromServices(services); if (selectedService == nullptr) { @@ -187,6 +194,7 @@ void CustomerMenu::selectService() } selectedServices.push_back(selectedService->getId()); util::clear(); + std::cout << "Enter Vehicle Details\n"; std::cout << "Enter vehicle number: "; util::read(vehicleNumber); std::cout << "Enter vehicle brand: "; @@ -208,8 +216,15 @@ Return type: void void CustomerMenu::selectComboPackage() { std::string vehicleNumber, vehicleBrand, vehicleModel; - auto comboPackages = m_controller.getComboPackages(); util::clear(); + std::cout << "Select a Combo Package\n"; + auto comboPackages = m_controller.getComboPackages(); + if (comboPackages.isEmpty()) + { + std::cout << "No combo packages available!"; + util::pressEnter(); + return; + } const ComboPackage* selectedComboPackage = selectComboPackageFromPackages(comboPackages); if (selectedComboPackage == nullptr) { diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h index 65c0d64..09c4ecc 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h @@ -77,7 +77,7 @@ inline std::string selectServicesToRemove(util::Map } else { - std::cout << "Invalid choice." << std::endl; + std::cout << "Invalid index." << std::endl; return ""; } } @@ -91,7 +91,7 @@ Parameters: Returns: - void */ -static void selectInventoryItems(util::Map& currentInventoryItems, util::Vector& selectedInventoryItems) +inline void selectInventoryItems(util::Map& currentInventoryItems, util::Vector& selectedInventoryItems) { bool doRun = true, hasInventoryItems = false; util::Map currentInventoryMap; @@ -166,7 +166,7 @@ Parameters: Returns: - bool: True if pending services exist, False otherwise */ -static bool listServiceBookings(util::Map& currentBookings, int& bookingsSize, util::Map& serviceBookingsMap) +inline bool listServiceBookings(util::Map& currentBookings, int& bookingsSize, util::Map& serviceBookingsMap) { int currentIndex = 1; bool hasPendingService = false; @@ -220,7 +220,7 @@ Parameters: Returns: - const ServiceBooking*: Pointer to the selected booking, or nullptr if invalid */ -static const ServiceBooking* selectPendingServiceBookings(util::Map& serviceBookingsMap) +inline const ServiceBooking* selectPendingServiceBookings(util::Map& serviceBookingsMap) { int userInputIndex; std::cout << "Enter a valid service index: "; @@ -246,7 +246,7 @@ Parameters: Returns: - void */ -static void listAvailableTechnicians(util::Map currentAvailableTechnicians, int numberOfTechnicians, util::Map& currentAvailableTechniciansMap) +inline void listAvailableTechnicians(util::Map currentAvailableTechnicians, int numberOfTechnicians, util::Map& currentAvailableTechniciansMap) { bool hasTechnicians = false; int currentIndex = 1; @@ -284,7 +284,7 @@ Parameters: Returns: - const User*: Pointer to the selected technician, or nullptr if invalid */ -static const User* selectTechnician(util::Map& currentAvailableTechniciansMap) +inline const User* selectTechnician(util::Map& currentAvailableTechniciansMap) { int userInputIndex; util::read(userInputIndex); @@ -307,7 +307,7 @@ Parameters: Returns: - std::string: ID of the selected invoice, or empty string if none selected */ -static std::string selectInvoiceFromUserForPayment(const util::Map& currentInvoices) +inline std::string selectInvoiceFromUserForPayment(const util::Map& currentInvoices) { int currentIndex = 1, choice; util::Map pendingInvoicesForPayment; @@ -359,7 +359,7 @@ static std::string selectInvoiceFromUserForPayment(const util::Map currentUserInvoices) +inline void displayInvoices(util::Map currentUserInvoices) { if (currentUserInvoices.getSize() == 0) { @@ -471,7 +471,7 @@ Parameters: Returns: - std::string: ID of the selected job card, or empty string if none selected */ -static std::string selectJobCardToComplete(util::Map& assignedJobCards, util::Map& incompleteJobCards) +inline std::string selectJobCardToComplete(util::Map& assignedJobCards, util::Map& incompleteJobCards) { int currentIndex = 1; int choice; @@ -513,7 +513,7 @@ static std::string selectJobCardToComplete(util::MapgetPassword()) + { + std::cout << "New password cannot be same as old password. Try again\n"; + util::pressEnter(); + continue; + } + std::cout << "Confirm new password: "; + util::read(confirmedPassword); + if (confirmedPassword != newPassword) + { + std::cout << "Passwords are different. Try again\n"; + util::pressEnter(); + continue; + } controller.changePassword(newPassword); std::cout << "Password changed successfully\n"; util::pressEnter(); @@ -764,8 +784,8 @@ inline const ComboPackage* selectComboPackageFromPackages(const util::MapgetState() != util::State::INACTIVE) { switch (authenticatedUser->getUserType()) { @@ -110,10 +111,16 @@ void UserInterface::login() break; } } + else if (authenticatedUser && authenticatedUser->getState() == util::State::INACTIVE) + { + std::cout << "\nError: Your account has been disabled. Please contact your Administrator."; + util::pressEnter(); + } } else { std::cout << "\nError: Invalid Username or Password"; + util::pressEnter(); } } @@ -129,6 +136,7 @@ void UserInterface::registerCustomer() { std::string username, name, email, phone, password; util::clear(); + std::cout << "Register Customer\n"; std::cout << "Enter username: "; util::read(username); std::cout << "Enter name: ";