Compare commits

..

12 Commits

Author SHA1 Message Date
Jissin Mathew 500eb95f12 Add documentation headers across system modules 2026-05-22 12:49:14 +05:30
Jissin Mathew 340f00deef Merge branch 'feature-notification-management-not006' into feature-notification-management 2026-05-21 21:07:17 +05:30
Jissin Mathew 0933db41a5 Merge branch 'feature-notification-management-not005' into feature-notification-management 2026-05-21 21:00:20 +05:30
Jissin Mathew 8a595a5893 Merge branch 'feature-notification-management-not004' into feature-notification-management 2026-05-21 20:54:20 +05:30
Jissin Mathew a8f934c7c5 Merge branch 'feature-notification-management-not003' into feature-notification-management 2026-05-21 20:48:41 +05:30
Jissin Mathew 166cc02aaa Merge branch 'feature-notification-management-not002' into feature-notification-management 2026-05-21 20:46:02 +05:30
joelthomastrenser b8e87ade0f Implement View Customer Notifications
<UserStory> NOT001: View Customer Notifications </UserStory>

<Changes>
1. Added shared notification helper functions to display notifications in tabular format, support notification selection, and show full notification details.
2. Implemented notification deletion logic in Controller and UserManagementService to remove notifications for the authenticated user after viewing.
3. Updated CustomerMenu::viewNotifications() to use the shared notification viewing and deletion flow.
</Changes>

<Test>

Precondition:
1. Customer is registered in the system.
2. Customer is logged into the system.
3. Customer has one or more notifications available.

Steps:
1. Navigate to “View Notifications” from the customer menu.
- Verify that the system displays the list of notifications with title and timestamp.

2. Select a notification from the displayed list.
   - Verify that the system displays the full notification details including message.

3. View the selected notification and continue.
   - Verify that the viewed notification is deleted from the system.

4. Navigate to “View Notifications” again.
   - Verify that the previously viewed notification no longer appears in the notification list.

</Test>

<Review>
Sreeja Reghukumar, please review
</Review>
2026-05-21 20:39:13 +05:30
joelthomastrenser b9be43acca Implement Payment Reminder functionality
<UserStory>
NOT005: Payment Reminder
</UserStory>

<Changes>
    1. Added payment reminder check in Controller::runSystemChecks() to trigger reminder processing during system startup.
    2. Implemented PaymentManagementService::sendPaymentReminders() to identify unpaid invoices that exceed the pending payment threshold and send reminder notifications to customers.
    3. Added reminder notification logic to include invoice details and stop reminders once invoice payment status changes from Pending to Paid.
</Changes>

<Test>
    Precondition:
    1. Customer has an invoice with PaymentStatus::PENDING.
    2. Invoice age exceeds the configured payment reminder threshold.
    3. Application is started and system checks execute.

    Steps:
    1. Start the application.
    2. Allow system checks to run during startup.
    3. Navigate to View Notifications.
       - Verify that a payment reminder notification is displayed.
    4. Open the generated notification.
       - Verify that the notification includes the invoice ID and due date.
    5. Complete payment for the invoice and restart the application.
       - Verify that no further reminder notifications are generated for the paid invoice.
</Test>

<Review>
    Sreeja Reghukumar, please review
</Review>
2026-05-21 12:25:45 +05:30
joelthomastrenser aef0f4146e Implement Low Stock Alert functionality
<UserStory> NOT004: Low Stock Alert </UserStory>

<Changes>
    1. Added low stock alert check in Controller::runSystemChecks() to trigger inventory notification processing during system startup.
    2. Implemented InventoryManagementService::sendLowStockAlerts() to detect inventory items below threshold, identify admin users, and send low stock alert notifications with item details.
    3. Added helper logic to notify all admins when low stock inventory is detected.

</Changes>

<Test>

    Precondition:
    1. System has at least one admin user.
    2. Inventory item exists with quantity below the configured low stock threshold.
    3. Application is started and system checks execute.

    Steps:
    1. Start the application.
    2. Allow system checks to run during startup.
    3. Navigate to Inventory Menu / View Notifications.
       - Verify that a low stock alert notification is displayed.
    4. Open the generated notification.
       - Verify that the notification includes the part name and remaining quantity.
    5. Confirm notification content.
       - Verify that the alert was triggered only for inventory items with stock below the threshold.

</Test>

<Review>
    Sreeja Reghukumar, please review
</Review>
2026-05-21 12:20:39 +05:30
joelthomastrenser c92ad773c7 Implement Configure Notifications functionality
<UserStory> NOT006: Configure Notifications </UserStory>

<Changes>
    1. Added notification subscription configuration in CustomerMenu to allow customers to enable or disable notifications for Payment Management Service and Service Management Service.
    2. Updated Controller::configureNotifications() to attach or detach the authenticated user from service observers based on selected notification preferences.
    3. Refactored Observer interface and User notification handling to support notification delivery through observer subscriptions.
    4. Implemented observer attach, detach, and sendNotification logic in InventoryManagementService, PaymentManagementService, and ServiceManagementService to ensure notifications are sent only to subscribed users.

</Changes>

<Test>

    Precondition:
    1. Customer user is logged into the system.
    2. Notification configuration option is available in Customer Menu.
    3. Notification-triggering event exists for Payment Management Service or Service Management Service.

    Steps:
    1. Navigate to Configure Notification Preferences in Customer Menu.
    2. Enable notifications for one service and disable notifications for the other.
    3. Trigger a notification event for both services.
       - Verify that notification is received only from the subscribed service.
    4. Change preferences by disabling the subscribed service and enabling the other.
    5. Trigger notification events again.
       - Verify that notification is received only from the newly subscribed service.

</Test>

<Review>
    Sreeja Reghukumar, please review
</Review>
2026-05-20 19:55:54 +05:30
joelthomastrenser 713c3b6cf9 Implement View Technician Notifications
<UserStory> NOT003: View Technician Notifications </UserStory>

<Changes>
    1. Added MenuHelper.h to the project for shared notification viewing helper support.
    2. Updated TechnicianMenu.cpp to include MenuHelper.h and route viewNotifications() through the shared notification handler.
</Changes>

<Test>

    Precondition:
    1. Technician user exists and is logged into the system.
    2. Technician has one or more notifications available.
    3. “View Notifications” option is visible in the Technician menu.

    Steps:
    1. Navigate to Technician Menu.
    2. Select “View Notifications”.
    3. Verify that the system displays a list of notifications showing title, message, and timestamp.
    4. Select a notification to view full details.
       - Verify that the selected notification is displayed and deleted after viewing.
    5. Return to the notification list or reopen “View Notifications”.
       - Verify that the previously viewed notification is no longer present.

</Test>

<Review>
    Sreeja Reghukumar, please review
</Review>
2026-05-20 16:24:34 +05:30
joelthomastrenser 1732776d13 Implement View Admin Notifications
<UserStory> NOT002: View Admin Notifications </UserStory>

<Changes>
    1. Added shared notification view handler `viewAndDeleteNotification()` in MenuHelper.h for notification viewing and deletion logic reuse.
    2. Updated AdminMenu.cpp to include MenuHelper.h and connected AdminMenu::viewNotifications() to the shared notification handler.
</Changes>

<Test>

    Precondition:
    1. Admin user exists and is logged into the system.
    2. Admin has one or more notifications available.
    3. “View Notifications” option is visible in the Admin menu.

    Steps:
    1. Navigate to Admin Menu.
    2. Select “View Notifications”.
    3. Verify that the system displays a list of notifications showing title, message, and timestamp.
    4. Select a notification to view full details.
       - Verify that the selected notification is displayed and deleted after viewing.
    5. Return to the notification list or reopen “View Notifications”.
       - Verify that the previously viewed notification is no longer present.

</Test>

<Review>
    Sreeja Reghukumar, please review
</Review>
2026-05-20 16:10:04 +05:30
47 changed files with 2157 additions and 913 deletions
@@ -1,7 +1,24 @@
/*
File: Trenser.VehicleServiceSystem.cpp
Description: Entry point for the Vehicle Service Management System.
Initializes the UserInterface and starts the application loop.
Author: Trenser
Date: 19-May-2026
*/
#include "UserInterface.h" #include "UserInterface.h"
/*
Function: main
Description: The main entry point of the application.
Creates a UserInterface object and invokes the run method to start the system.
Parameters:
- None
Returns:
- int: Exit status code (0 for successful execution).
*/
int main() int main()
{ {
UserInterface userInterface; UserInterface userInterface;
userInterface.run(); userInterface.run();
} }
@@ -233,5 +233,8 @@
<ClInclude Include="models\ComboPackage.h"> <ClInclude Include="models\ComboPackage.h">
<Filter>Header Files\Models</Filter> <Filter>Header Files\Models</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="views\MenuHelper.h">
<Filter>Header Files\Views</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
@@ -1,95 +1,42 @@
/* /*
File: Controller.cpp File: Controller.cpp
Description: Implementation file containing the method definitions of the Description: Implements the Controller class which manages authentication, user, service, inventory, payment, and notification operations in the Vehicle Service Management System.
Controller class, including authentication, user creation,
service purchasing, and system checks.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#include <stdexcept> #include <stdexcept>
#include "Controller.h" #include "Controller.h"
#include "Enums.h"
#include "User.h" #include "User.h"
/*
Function: login
Description: Authenticates a user by delegating to the authentication management service.
Parameter: const std::string& username - users username
const std::string& password - users password
Return type: bool - true if login successful, false otherwise
*/
bool Controller::login(const std::string& username, const std::string& password) bool Controller::login(const std::string& username, const std::string& password)
{ {
return m_authenticationManagementService.login(username, password); return false;
} }
/*
Function: logout
Description: Logs out the currently authenticated user.
Parameter: None
Return type: void
*/
void Controller::logout() void Controller::logout()
{ {
m_authenticationManagementService.logout();
} }
/*
Function: changePassword
Description: Changes the password of the currently authenticated user.
Parameter: const std::string& newPassword - new password to set
Return type: void
*/
void Controller::changePassword(const std::string& newPassword) 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)
Function: createCustomer
Description: Creates a new customer account with the provided details.
Parameter: const std::string& username - customers username
const std::string& name - customers name
const std::string& password - customers password
const std::string& email - customers email
const std::string& phone - customers phone number
Return type: void
*/
void Controller::createCustomer(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phone)
{ {
m_userManagementService.createUser(username, name, password, email, phone, util::UserType::CUSTOMER);
} }
/*
Function: getAuthenticatedUser
Description: Retrieves the currently authenticated user.
Parameter: None
Return type: const User* - pointer to the authenticated user
*/
const User* Controller::getAuthenticatedUser() const User* Controller::getAuthenticatedUser()
{ {
return m_authenticationManagementService.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& phone)
{ {
} }
/*
Function: updateUserDetails
Description: Updates the email and phone details of the currently authenticated user.
Parameter: const std::string& email - new email address
const std::string& phone - new phone number
Return type: void
*/
void Controller::updateUserDetails(const std::string& email, const std::string& phone) void Controller::updateUserDetails(const std::string& email, const std::string& phone)
{ {
User* authenticatedUser = m_authenticationManagementService.getAuthenticatedUser();
if (authenticatedUser == nullptr)
{
throw std::runtime_error("No user currently logged in!");
}
m_userManagementService.updateUserDetails(authenticatedUser->getId(), email, phone);
} }
util::Map<std::string, const Service*> Controller::getServices() util::Map<std::string, const Service*> Controller::getServices()
@@ -102,32 +49,12 @@ util::Map<std::string, const ComboPackage*> Controller::getComboPackages()
return util::Map<std::string, const ComboPackage*>(); return util::Map<std::string, const ComboPackage*>();
} }
/*
Function: purchaseService
Description: Purchases one or more services for a vehicle by delegating to the service management service.
Parameter: const util::Vector<std::string>& serviceIDs - IDs of services to purchase
const std::string& vehicleNumber - vehicle registration number
const std::string& vehicleBrand - brand of the vehicle
const std::string& vehicleModel - model of the vehicle
Return type: void
*/
void Controller::purchaseService(const util::Vector<std::string>& serviceIDs, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel) void Controller::purchaseService(const util::Vector<std::string>& serviceIDs, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel)
{ {
m_serviceManagementService.purchaseService(serviceIDs, vehicleNumber, vehicleBrand, vehicleModel);
} }
/*
Function: purchaseComboPackage
Description: Purchases a combo package for a vehicle by delegating to the service management service.
Parameter: const std::string& comboPackageID - ID of the combo package
const std::string& vehicleNumber - vehicle registration number
const std::string& vehicleBrand - brand of the vehicle
const std::string& vehicleModel - model of the vehicle
Return type: void
*/
void Controller::purchaseComboPackage(const std::string& comboPackageID, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel) void Controller::purchaseComboPackage(const std::string& comboPackageID, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel)
{ {
m_serviceManagementService.purchaseComboPackage(comboPackageID, vehicleNumber, vehicleBrand, vehicleModel);
} }
util::Map<std::string, const InventoryItem*> Controller::getInventoryItems() util::Map<std::string, const InventoryItem*> Controller::getInventoryItems()
@@ -210,27 +137,94 @@ void Controller::completePayment(const std::string& invoiceID, util::PaymentMode
{ {
} }
/*
Function: getNotifications
Description: Retrieves all notifications for the currently authenticated user.
Converts them into a read-only vector before returning.
Parameters: None
Return type: util::Vector<const Notification*>
*/
util::Vector<const Notification*> Controller::getNotifications() util::Vector<const Notification*> Controller::getNotifications()
{ {
return util::Vector<const Notification*>(); const User* authenticatedUser = m_authenticationManagementService.getAuthenticatedUser();
if (!authenticatedUser)
{
throw std::runtime_error("No user is currently logged in!");
}
auto notifications = m_userManagementService.getUserNotifications(authenticatedUser->getId());
int numberOfNotifications = notifications.getSize();
util::Vector<const Notification*> readOnlyNotifications;
for (int index = 0; index < numberOfNotifications; index++)
{
readOnlyNotifications.push_back(notifications[index]);
}
return readOnlyNotifications;
} }
/*
Function: deleteNotification
Description: Deletes a specific notification for the currently authenticated user.
Parameters:
- notificationID: std::string, the unique identifier of the notification
Return type: void
*/
void Controller::deleteNotification(const std::string& notificationID) void Controller::deleteNotification(const std::string& notificationID)
{ {
const User* authenticatedUser = m_authenticationManagementService.getAuthenticatedUser();
if (!authenticatedUser)
{
throw std::runtime_error("No user is currently logged in!");
}
m_userManagementService.deleteNotification(notificationID, authenticatedUser->getId());
} }
void Controller::configureNotifications(const std::string& userID, bool paymentNotifications, bool serviceNotifications) /*
Function: configureNotifications
Description: Configures notification preferences for the authenticated user.
Attaches or detaches the user from payment and service notifications.
Parameters:
- paymentNotifications: bool, enable/disable payment notifications
- serviceNotifications: bool, enable/disable service notifications
Return type: void
*/
void Controller::configureNotifications(bool paymentNotifications, bool serviceNotifications)
{ {
User* authenticatedUser = m_authenticationManagementService.getAuthenticatedUser();
if (authenticatedUser)
{
if (paymentNotifications)
{
m_paymentManagementService.attach(authenticatedUser);
}
else
{
m_paymentManagementService.detach(authenticatedUser);
}
if (serviceNotifications)
{
m_serviceManagementService.attach(authenticatedUser);
}
else
{
m_serviceManagementService.detach(authenticatedUser);
}
}
else
{
throw std::runtime_error("No user is currently logged in!");
}
} }
/* /*
Function: runSystemChecks Function: runSystemChecks
Description: Runs system checks to ensure critical configurations, such as verifying admin existence. Description: Executes system checks including sending low stock alerts
Parameter: None and payment reminders.
Parameters: None
Return type: void Return type: void
*/ */
void Controller::runSystemChecks() void Controller::runSystemChecks()
{ {
m_userManagementService.ensureAdminExists(); m_inventoryManagementService.sendLowStockAlerts();
m_paymentManagementService.sendPaymentReminders();
} }
@@ -1,18 +1,19 @@
/* /*
File: Controller.h File: Controller.h
Description: Header file declaring the Controller class, which coordinates Description: File contains the Controller class which manages authentication, user, service, inventory, payment, and notification operations in the Vehicle Service Management System.
authentication, user management, service management, inventory,
and notifications across the Vehicle Service System.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include "Map.h" #include "Map.h"
#include <string> #include <string>
#include "Enums.h" #include "Enums.h"
#include "AuthenticationManagementService.h" #include "AuthenticationManagementService.h"
#include "UserManagementService.h"
#include "ServiceManagementService.h" #include "ServiceManagementService.h"
#include "UserManagementService.h"
#include "InventoryManagementService.h"
#include "PaymentManagementService.h"
class Service; class Service;
class ComboPackage; class ComboPackage;
@@ -28,12 +29,14 @@ class Controller
private: private:
AuthenticationManagementService m_authenticationManagementService; AuthenticationManagementService m_authenticationManagementService;
UserManagementService m_userManagementService; UserManagementService m_userManagementService;
InventoryManagementService m_inventoryManagementService;
PaymentManagementService m_paymentManagementService;
ServiceManagementService m_serviceManagementService; ServiceManagementService m_serviceManagementService;
public: public:
bool login(const std::string& username, const std::string& password); bool login(const std::string& username, const std::string& password);
void logout(); void logout();
void changePassword(const std::string& newPassword); void changePassword(const std::string& newPassword);
void createCustomer(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phone); void createCustomer(const std::string& username, const std::string& password, const std::string& email, const std::string& phone);
const User* getAuthenticatedUser(); 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& phone);
void updateUserDetails(const std::string& email, const std::string& phone); void updateUserDetails(const std::string& email, const std::string& phone);
@@ -61,6 +64,6 @@ public:
void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode); void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode);
util::Vector<const Notification*> getNotifications(); util::Vector<const Notification*> getNotifications();
void deleteNotification(const std::string& notificationID); void deleteNotification(const std::string& notificationID);
void configureNotifications(const std::string& userID, bool paymentNotifications, bool serviceNotifications); void configureNotifications(bool paymentNotifications, bool serviceNotifications);
void runSystemChecks(); void runSystemChecks();
}; };
@@ -1,3 +1,10 @@
/*
File: Observer.h
Description: Declares the Observer interface for handling notifications in the Vehicle Service Management System.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
class Notification; class Notification;
@@ -6,5 +13,5 @@ class Observer
{ {
public: public:
virtual ~Observer() = default; virtual ~Observer() = default;
virtual void update(Notification* notification) = 0; virtual void addNotification(Notification* notification) = 0;
}; };
@@ -1,3 +1,10 @@
/*
File: Subject.h
Description: Declares the Subject interface for managing user attachments and detachments in the Observer design pattern within the Vehicle Service Management System.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,46 +1,128 @@
/*
File: DataStore.cpp
Description: Implements the DataStore class which provides a centralized singleton repository
for managing system data in the Vehicle Service Management System.
Includes accessors for users, services, combo packages, service bookings,
job cards, inventory items, invoices, and payments.
Author: Trenser
Date: 19-May-2026
*/
#include "DataStore.h" #include "DataStore.h"
/*
Function: getInstance
Description: Provides a singleton instance of the DataStore class.
Parameters:
- None
Returns:
- Reference to the single DataStore instance.
*/
DataStore& DataStore::getInstance() DataStore& DataStore::getInstance()
{ {
static DataStore dataStore; static DataStore dataStore;
return dataStore; return dataStore;
} }
/*
Function: getUsers
Description: Retrieves the internal map of users.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, User*> containing all users.
*/
util::Map<std::string, User*>& DataStore::getUsers() util::Map<std::string, User*>& DataStore::getUsers()
{ {
return m_users; return m_users;
} }
/*
Function: getServices
Description: Retrieves the internal map of services.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, Service*> containing all services.
*/
util::Map<std::string, Service*>& DataStore::getServices() util::Map<std::string, Service*>& DataStore::getServices()
{ {
return m_services; return m_services;
} }
/*
Function: getComboPackages
Description: Retrieves the internal map of combo packages.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, ComboPackage*> containing all combo packages.
*/
util::Map<std::string, ComboPackage*>& DataStore::getComboPackages() util::Map<std::string, ComboPackage*>& DataStore::getComboPackages()
{ {
return m_comboPackages; return m_comboPackages;
} }
/*
Function: getServiceBookings
Description: Retrieves the internal map of service bookings.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, ServiceBooking*> containing all service bookings.
*/
util::Map<std::string, ServiceBooking*>& DataStore::getServiceBookings() util::Map<std::string, ServiceBooking*>& DataStore::getServiceBookings()
{ {
return m_serviceBookings; return m_serviceBookings;
} }
/*
Function: getJobCards
Description: Retrieves the internal map of job cards.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, JobCard*> containing all job cards.
*/
util::Map<std::string, JobCard*>& DataStore::getJobCards() util::Map<std::string, JobCard*>& DataStore::getJobCards()
{ {
return m_jobCards; return m_jobCards;
} }
/*
Function: getInventoryItems
Description: Retrieves the internal map of inventory items.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, InventoryItem*> containing all inventory items.
*/
util::Map<std::string, InventoryItem*>& DataStore::getInventoryItems() util::Map<std::string, InventoryItem*>& DataStore::getInventoryItems()
{ {
return m_inventoryItems; return m_inventoryItems;
} }
/*
Function: getInvoices
Description: Retrieves the internal map of invoices.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, Invoice*> containing all invoices.
*/
util::Map<std::string, Invoice*>& DataStore::getInvoices() util::Map<std::string, Invoice*>& DataStore::getInvoices()
{ {
return m_invoices; return m_invoices;
} }
/*
Function: getPayments
Description: Retrieves the internal map of payments.
Parameters:
- None
Returns:
- Reference to util::Map<std::string, Payment*> containing all payments.
*/
util::Map<std::string, Payment*>& DataStore::getPayments() util::Map<std::string, Payment*>& DataStore::getPayments()
{ {
return m_payments; return m_payments;
@@ -1,5 +1,11 @@
#pragma once /*
File: DataStore.h
Description: Declares the DataStore singleton class responsible for managing collections of users, services, combo packages, service bookings, job cards, inventory items, invoices, and payments in the Vehicle Service Management System.
Author: Trenser
Date: 19-May-2026
*/
#pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,12 +1,41 @@
/*
File: ComboPackage.cpp
Description: Implements the ComboPackage class which represents a bundled set of services in the Vehicle Service Management System.
Provides constructors, accessors, and mutators for package details such as ID, name, discount percentage, state,
and associated services.
Author: Trenser
Date: 19-May-2026
*/
#include "ComboPackage.h" #include "ComboPackage.h"
int ComboPackage::m_uid = 0; int ComboPackage::m_uid = 0;
/*
Function: ComboPackage
Description: Default constructor that initializes a new combo package with a unique ID,
active state, and zero discount percentage.
Parameters:
- None
Returns:
- A new ComboPackage object.
*/
ComboPackage::ComboPackage() ComboPackage::ComboPackage()
: m_id("CMP" + std::to_string(++m_uid)), : m_id("CMP" + std::to_string(++m_uid)),
m_status(util::State::ACTIVE), m_status(util::State::ACTIVE),
m_discountPercentage(0.0) {} m_discountPercentage(0.0) {}
/*
Function: ComboPackage
Description: Parameterized constructor that initializes a new combo package with a unique ID,
specified package name, discount percentage, active state, and associated services.
Parameters:
- packageName: Name of the combo package.
- discountPercentage: Discount percentage applied to the package.
- services: Map of services included in the package.
Returns:
- A new ComboPackage object.
*/
ComboPackage::ComboPackage(const std::string& packageName, double discountPercentage, const util::Map<std::string, Service*>& services) ComboPackage::ComboPackage(const std::string& packageName, double discountPercentage, const util::Map<std::string, Service*>& services)
: m_id("CMP" + std::to_string(++m_uid)), : m_id("CMP" + std::to_string(++m_uid)),
m_packageName(packageName), m_packageName(packageName),
@@ -14,51 +43,131 @@ ComboPackage::ComboPackage(const std::string& packageName, double discountPercen
m_status(util::State::ACTIVE), m_status(util::State::ACTIVE),
m_services(services) {} m_services(services) {}
/*
Function: getId
Description: Retrieves the unique ID of the combo package.
Parameters:
- None
Returns:
- const std::string& representing the package ID.
*/
const std::string& ComboPackage::getId() const const std::string& ComboPackage::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getPackageName
Description: Retrieves the name of the combo package.
Parameters:
- None
Returns:
- const std::string& representing the package name.
*/
const std::string& ComboPackage::getPackageName() const const std::string& ComboPackage::getPackageName() const
{ {
return m_packageName; return m_packageName;
} }
/*
Function: getDiscountPercentage
Description: Retrieves the discount percentage applied to the combo package.
Parameters:
- None
Returns:
- double representing the discount percentage.
*/
double ComboPackage::getDiscountPercentage() const double ComboPackage::getDiscountPercentage() const
{ {
return m_discountPercentage; return m_discountPercentage;
} }
/*
Function: getState
Description: Retrieves the current state (ACTIVE/INACTIVE) of the combo package.
Parameters:
- None
Returns:
- util::State representing the package state.
*/
util::State ComboPackage::getState() const util::State ComboPackage::getState() const
{ {
return m_status; return m_status;
} }
/*
Function: getServices
Description: Retrieves the map of services included in the combo package.
Parameters:
- None
Returns:
- const util::Map<std::string, Service*>& representing the services.
*/
const util::Map<std::string, Service*>& ComboPackage::getServices() const const util::Map<std::string, Service*>& ComboPackage::getServices() const
{ {
return m_services; return m_services;
} }
/*
Function: setId
Description: Sets the unique ID of the combo package.
Parameters:
- id: New ID string.
Returns:
- void
*/
void ComboPackage::setId(const std::string& id) void ComboPackage::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setPackageName
Description: Sets the name of the combo package.
Parameters:
- packageName: New package name string.
Returns:
- void
*/
void ComboPackage::setPackageName(const std::string& packageName) void ComboPackage::setPackageName(const std::string& packageName)
{ {
m_packageName = packageName; m_packageName = packageName;
} }
/*
Function: setDiscountPercentage
Description: Sets the discount percentage for the combo package.
Parameters:
- discountPercentage: New discount percentage value.
Returns:
- void
*/
void ComboPackage::setDiscountPercentage(double discountPercentage) void ComboPackage::setDiscountPercentage(double discountPercentage)
{ {
m_discountPercentage = discountPercentage; m_discountPercentage = discountPercentage;
} }
/*
Function: setServices
Description: Sets the services included in the combo package.
Parameters:
- services: Map of services to be associated with the package.
Returns:
- void
*/
void ComboPackage::setServices(const util::Map<std::string, Service*>& services) void ComboPackage::setServices(const util::Map<std::string, Service*>& services)
{ {
m_services = services; m_services = services;
} }
/*
Function: setState
Description: Sets the state (ACTIVE/INACTIVE) of the combo package.
Parameters:
- status: New state value.
Returns:
- void
*/
void ComboPackage::setState(util::State status) void ComboPackage::setState(util::State status)
{ {
m_status = status; m_status = status;
@@ -1,3 +1,10 @@
/*
File: ComboPackage.h
Description: Declares the ComboPackage class which represents a service package with a unique ID, package name, discount percentage, associated services, and status in the Vehicle Service Management System.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,13 +1,41 @@
/*
File: InventoryItem.cpp
Description: Implements the InventoryItem class which represents an inventory item in the Vehicle Service Management System.
Provides constructors, accessors, and mutators for item details such as ID, part name, quantity, price, and state.
Author: Trenser
Date: 19-May-2026
*/
#include "InventoryItem.h" #include "InventoryItem.h"
int InventoryItem::m_uid = 0; int InventoryItem::m_uid = 0;
/*
Function: InventoryItem
Description: Default constructor that initializes a new inventory item with a unique ID,
active state, zero quantity, and zero price.
Parameters:
- None
Returns:
- A new InventoryItem object.
*/
InventoryItem::InventoryItem() InventoryItem::InventoryItem()
: m_id("IIM" + std::to_string(++m_uid)), : m_id("IIM" + std::to_string(++m_uid)),
m_quantity(0), m_quantity(0),
m_status(util::State::ACTIVE), m_status(util::State::ACTIVE),
m_price(0.0) {} m_price(0.0) {}
/*
Function: InventoryItem
Description: Parameterized constructor that initializes a new inventory item with a unique ID,
specified part name, quantity, price, and active state.
Parameters:
- partName: Name of the inventory item.
- quantity: Initial quantity of the item.
- price: Price of the item.
Returns:
- A new InventoryItem object.
*/
InventoryItem::InventoryItem(const std::string& partName, int quantity, double price) InventoryItem::InventoryItem(const std::string& partName, int quantity, double price)
: m_id("IIM" + std::to_string(++m_uid)), : m_id("IIM" + std::to_string(++m_uid)),
m_partName(partName), m_partName(partName),
@@ -15,51 +43,131 @@ InventoryItem::InventoryItem(const std::string& partName, int quantity, double p
m_status(util::State::ACTIVE), m_status(util::State::ACTIVE),
m_price(price) {} m_price(price) {}
/*
Function: getId
Description: Retrieves the unique ID of the inventory item.
Parameters:
- None
Returns:
- const std::string& representing the item ID.
*/
const std::string& InventoryItem::getId() const const std::string& InventoryItem::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getPartName
Description: Retrieves the part name of the inventory item.
Parameters:
- None
Returns:
- const std::string& representing the part name.
*/
const std::string& InventoryItem::getPartName() const const std::string& InventoryItem::getPartName() const
{ {
return m_partName; return m_partName;
} }
/*
Function: getQuantity
Description: Retrieves the current quantity of the inventory item.
Parameters:
- None
Returns:
- int representing the quantity.
*/
int InventoryItem::getQuantity() const int InventoryItem::getQuantity() const
{ {
return m_quantity; return m_quantity;
} }
/*
Function: getPrice
Description: Retrieves the price of the inventory item.
Parameters:
- None
Returns:
- double representing the price.
*/
double InventoryItem::getPrice() const double InventoryItem::getPrice() const
{ {
return m_price; return m_price;
} }
/*
Function: getState
Description: Retrieves the current state (ACTIVE/INACTIVE) of the inventory item.
Parameters:
- None
Returns:
- util::State representing the item state.
*/
util::State InventoryItem::getState() const util::State InventoryItem::getState() const
{ {
return m_status; return m_status;
} }
/*
Function: setId
Description: Sets the unique ID of the inventory item.
Parameters:
- id: New ID string.
Returns:
- void
*/
void InventoryItem::setId(const std::string& id) void InventoryItem::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setPartName
Description: Sets the part name of the inventory item.
Parameters:
- partName: New part name string.
Returns:
- void
*/
void InventoryItem::setPartName(const std::string& partName) void InventoryItem::setPartName(const std::string& partName)
{ {
m_partName = partName; m_partName = partName;
} }
/*
Function: setQuantity
Description: Sets the quantity of the inventory item.
Parameters:
- quantity: New quantity value.
Returns:
- void
*/
void InventoryItem::setQuantity(int quantity) void InventoryItem::setQuantity(int quantity)
{ {
m_quantity = quantity; m_quantity = quantity;
} }
/*
Function: setPrice
Description: Sets the price of the inventory item.
Parameters:
- price: New price value.
Returns:
- void
*/
void InventoryItem::setPrice(double price) void InventoryItem::setPrice(double price)
{ {
m_price = price; m_price = price;
} }
/*
Function: setState
Description: Sets the state (ACTIVE/INACTIVE) of the inventory item.
Parameters:
- status: New state value.
Returns:
- void
*/
void InventoryItem::setState(util::State status) void InventoryItem::setState(util::State status)
{ {
m_status = status; m_status = status;
@@ -1,3 +1,12 @@
/*
File: InventoryItem.h
Description: Declares the InventoryItem class which represents parts in the Vehicle Service Management System.
Each item has a unique ID, part name, quantity, price, and status.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Enums.h" #include "Enums.h"
@@ -1,7 +1,26 @@
/*
File: Invoice.cpp
Description: Implements the Invoice class which represents an invoice in the Vehicle Service Management System.
Provides constructors, accessors, and mutators for invoice details such as ID, booking, costs,
discount percentage, total amount, payment details, and status.
Author: Trenser
Date: 19-May-2026
*/
#include "Invoice.h" #include "Invoice.h"
int Invoice::m_uid = 0; int Invoice::m_uid = 0;
/*
Function: Invoice
Description: Default constructor that initializes a new invoice with a unique ID,
null booking, zero costs, zero discount, zero total amount,
and default payment method and status.
Parameters:
- None
Returns:
- A new Invoice object.
*/
Invoice::Invoice() Invoice::Invoice()
: m_id("INV" + std::to_string(++m_uid)), : m_id("INV" + std::to_string(++m_uid)),
m_booking(nullptr), m_booking(nullptr),
@@ -12,6 +31,24 @@ Invoice::Invoice()
m_paymentMethod(util::PaymentMode()), m_paymentMethod(util::PaymentMode()),
m_status(util::PaymentStatus()) {} m_status(util::PaymentStatus()) {}
/*
Function: Invoice
Description: Parameterized constructor that initializes a new invoice with a unique ID and specified details.
Parameters:
- bookingId: ID of the associated service booking.
- booking: Pointer to the ServiceBooking object.
- invoiceDate: Timestamp of when the invoice was created.
- laborCost: Cost of labor for the service.
- parts: Map of inventory items used in the service.
- partsCost: Total cost of parts.
- discountPercentage: Discount applied to the invoice.
- totalAmount: Final total amount after discount.
- paymentDate: Timestamp of when payment was made.
- paymentMethod: Payment mode (ONLINE/OFFLINE).
- status: Payment status (PENDING/COMPLETED).
Returns:
- A new Invoice object.
*/
Invoice::Invoice( Invoice::Invoice(
const std::string& bookingId, const std::string& bookingId,
ServiceBooking* booking, ServiceBooking* booking,
@@ -38,122 +75,290 @@ Invoice::Invoice(
m_paymentMethod(paymentMethod), m_paymentMethod(paymentMethod),
m_status(status) {} m_status(status) {}
/*
Function: getId
Description: Retrieves the unique ID of the invoice.
Returns:
- const std::string& representing the invoice ID.
*/
const std::string& Invoice::getId() const const std::string& Invoice::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getBookingId
Description: Retrieves the booking ID associated with the invoice.
Returns:
- const std::string& representing the booking ID.
*/
const std::string& Invoice::getBookingId() const const std::string& Invoice::getBookingId() const
{ {
return m_bookingId; return m_bookingId;
} }
/*
Function: getBooking
Description: Retrieves the pointer to the associated ServiceBooking.
Returns:
- ServiceBooking* representing the booking.
*/
ServiceBooking* Invoice::getBooking() const ServiceBooking* Invoice::getBooking() const
{ {
return m_booking; return m_booking;
} }
/*
Function: getInvoiceDate
Description: Retrieves the timestamp of the invoice creation date.
Returns:
- const util::Timestamp& representing the invoice date.
*/
const util::Timestamp& Invoice::getInvoiceDate() const const util::Timestamp& Invoice::getInvoiceDate() const
{ {
return m_invoiceDate; return m_invoiceDate;
} }
/*
Function: getLaborCost
Description: Retrieves the labor cost associated with the invoice.
Returns:
- double representing the labor cost.
*/
double Invoice::getLaborCost() const double Invoice::getLaborCost() const
{ {
return m_laborCost; return m_laborCost;
} }
/*
Function: getParts
Description: Retrieves the map of inventory items used in the service.
Returns:
- const util::Map<int, InventoryItem*>& representing the parts.
*/
const util::Map<int, InventoryItem*>& Invoice::getParts() const const util::Map<int, InventoryItem*>& Invoice::getParts() const
{ {
return m_parts; return m_parts;
} }
/*
Function: getPartsCost
Description: Retrieves the total cost of parts used in the service.
Returns:
- double representing the parts cost.
*/
double Invoice::getPartsCost() const double Invoice::getPartsCost() const
{ {
return m_partsCost; return m_partsCost;
} }
/*
Function: getDiscountPercentage
Description: Retrieves the discount percentage applied to the invoice.
Returns:
- double representing the discount percentage.
*/
double Invoice::getDiscountPercentage() const double Invoice::getDiscountPercentage() const
{ {
return m_discountPercentage; return m_discountPercentage;
} }
/*
Function: getTotalAmount
Description: Retrieves the total amount of the invoice after discount.
Returns:
- double representing the total amount.
*/
double Invoice::getTotalAmount() const double Invoice::getTotalAmount() const
{ {
return m_totalAmount; return m_totalAmount;
} }
/*
Function: getPaymentDate
Description: Retrieves the timestamp of the payment date.
Returns:
- const util::Timestamp& representing the payment date.
*/
const util::Timestamp& Invoice::getPaymentDate() const const util::Timestamp& Invoice::getPaymentDate() const
{ {
return m_paymentDate; return m_paymentDate;
} }
/*
Function: getPaymentMethod
Description: Retrieves the payment mode used for the invoice.
Returns:
- util::PaymentMode representing the payment method.
*/
util::PaymentMode Invoice::getPaymentMethod() const util::PaymentMode Invoice::getPaymentMethod() const
{ {
return m_paymentMethod; return m_paymentMethod;
} }
/*
Function: getStatus
Description: Retrieves the payment status of the invoice.
Returns:
- util::PaymentStatus representing the payment status.
*/
util::PaymentStatus Invoice::getStatus() const util::PaymentStatus Invoice::getStatus() const
{ {
return m_status; return m_status;
} }
/*
Function: setId
Description: Sets the unique ID of the invoice.
Parameters:
- id: New invoice ID string.
Returns:
- void
*/
void Invoice::setId(const std::string& id) void Invoice::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setBookingId
Description: Sets the booking ID associated with the invoice.
Parameters:
- bookingId: New booking ID string.
Returns:
- void
*/
void Invoice::setBookingId(const std::string& bookingId) void Invoice::setBookingId(const std::string& bookingId)
{ {
m_bookingId = bookingId; m_bookingId = bookingId;
} }
/*
Function: setBooking
Description: Sets the associated ServiceBooking pointer.
Parameters:
- booking: Pointer to the ServiceBooking object.
Returns:
- void
*/
void Invoice::setBooking(ServiceBooking* booking) void Invoice::setBooking(ServiceBooking* booking)
{ {
m_booking = booking; m_booking = booking;
} }
/*
Function: setInvoiceDate
Description: Sets the invoice creation date.
Parameters:
- invoiceDate: New timestamp for the invoice date.
Returns:
- void
*/
void Invoice::setInvoiceDate(const util::Timestamp& invoiceDate) void Invoice::setInvoiceDate(const util::Timestamp& invoiceDate)
{ {
m_invoiceDate = invoiceDate; m_invoiceDate = invoiceDate;
} }
/*
Function: setLaborCost
Description: Sets the labor cost for the invoice.
Parameters:
- laborCost: New labor cost value.
Returns:
- void
*/
void Invoice::setLaborCost(double laborCost) void Invoice::setLaborCost(double laborCost)
{ {
m_laborCost = laborCost; m_laborCost = laborCost;
} }
/*
Function: setParts
Description: Sets the inventory items used in the service.
Parameters:
- parts: Map of inventory items.
Returns:
- void
*/
void Invoice::setParts(const util::Map<int, InventoryItem*>& parts) void Invoice::setParts(const util::Map<int, InventoryItem*>& parts)
{ {
m_parts = parts; m_parts = parts;
} }
/*
Function: setPartsCost
Description: Sets the total cost of parts used in the service.
Parameters:
- partsCost: New parts cost value.
Returns:
- void
*/
void Invoice::setPartsCost(double partsCost) void Invoice::setPartsCost(double partsCost)
{ {
m_partsCost = partsCost; m_partsCost = partsCost;
} }
/*
Function: setDiscountPercentage
Description: Sets the discount percentage applied to the invoice.
Parameters:
- discountPercentage: New discount percentage value.
Returns:
- void
*/
void Invoice::setDiscountPercentage(double discountPercentage) void Invoice::setDiscountPercentage(double discountPercentage)
{ {
m_discountPercentage = discountPercentage; m_discountPercentage = discountPercentage;
} }
/*
Function: setTotalAmount
Description: Sets the total amount of the invoice.
Parameters:
- totalAmount: New total amount value.
Returns:
- void
*/
void Invoice::setTotalAmount(double totalAmount) void Invoice::setTotalAmount(double totalAmount)
{ {
m_totalAmount = totalAmount; m_totalAmount = totalAmount;
} }
/*
Function: setPaymentDate
Description: Sets the payment date for the invoice.
Parameters:
- paymentDate: New timestamp for the payment date.
Returns:
- void
*/
void Invoice::setPaymentDate(const util::Timestamp& paymentDate) void Invoice::setPaymentDate(const util::Timestamp& paymentDate)
{ {
m_paymentDate = paymentDate; m_paymentDate = paymentDate;
} }
/*
Function: setPaymentMethod
Description: Sets the payment mode for the invoice.
Parameters:
- paymentMethod: New payment mode value.
Returns:
- void
*/
void Invoice::setPaymentMethod(util::PaymentMode paymentMethod) void Invoice::setPaymentMethod(util::PaymentMode paymentMethod)
{ {
m_paymentMethod = paymentMethod; m_paymentMethod = paymentMethod;
} }
/*
Function: setStatus
Description: Sets the payment status of the invoice.
Parameters:
- status: New payment status value.
Returns:
- void
*/
void Invoice::setStatus(util::PaymentStatus status) void Invoice::setStatus(util::PaymentStatus status)
{ {
m_status = status; m_status = status;
} }
@@ -1,3 +1,12 @@
/*
File: Invoice.h
Description: Declares the Invoice class which represents billing details for a service booking in the Vehicle Service Management System.
Each invoice includes booking information, labor cost, parts used, discount percentage, total amount, payment details, and status.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,7 +1,25 @@
/*
File: JobCard.cpp
Description: Implements the JobCard class which represents a technicians job assignment in the Vehicle Service Management System.
Provides constructors, accessors, and mutators for job details such as ID, booking, service, technician,
assigned date, completion date, and job status.
Author: Trenser
Date: 19-May-2026
*/
#include "JobCard.h" #include "JobCard.h"
int JobCard::m_uid = 0; int JobCard::m_uid = 0;
/*
Function: JobCard
Description: Default constructor that initializes a new job card with a unique ID,
null booking, null service, null technician, and default job status.
Parameters:
- None
Returns:
- A new JobCard object.
*/
JobCard::JobCard() JobCard::JobCard()
: m_id("JC" + std::to_string(++m_uid)), : m_id("JC" + std::to_string(++m_uid)),
m_booking(nullptr), m_booking(nullptr),
@@ -9,6 +27,22 @@ JobCard::JobCard()
m_technician(nullptr), m_technician(nullptr),
m_status(ServiceJobStatus()) {} m_status(ServiceJobStatus()) {}
/*
Function: JobCard
Description: Parameterized constructor that initializes a new job card with a unique ID and specified details.
Parameters:
- bookingId: ID of the associated service booking.
- booking: Pointer to the ServiceBooking object.
- service: Pointer to the Service object.
- serviceId: ID of the associated service.
- technicianId: ID of the assigned technician.
- technician: Pointer to the User object representing the technician.
- assignedDate: Timestamp of when the job was assigned.
- status: Current status of the job (STARTED/COMPLETED).
- completionDate: Timestamp of when the job was completed.
Returns:
- A new JobCard object.
*/
JobCard::JobCard(const std::string& bookingId, JobCard::JobCard(const std::string& bookingId,
ServiceBooking* booking, ServiceBooking* booking,
Service* service, Service* service,
@@ -30,101 +64,241 @@ JobCard::JobCard(const std::string& bookingId,
m_status(status), m_status(status),
m_completionDate(completionDate) {} m_completionDate(completionDate) {}
/*
Function: getId
Description: Retrieves the unique ID of the job card.
Returns:
- const std::string& representing the job card ID.
*/
const std::string& JobCard::getId() const const std::string& JobCard::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getBookingId
Description: Retrieves the booking ID associated with the job card.
Returns:
- const std::string& representing the booking ID.
*/
const std::string& JobCard::getBookingId() const const std::string& JobCard::getBookingId() const
{ {
return m_bookingId; return m_bookingId;
} }
/*
Function: getBooking
Description: Retrieves the pointer to the associated ServiceBooking.
Returns:
- ServiceBooking* representing the booking.
*/
ServiceBooking* JobCard::getBooking() const ServiceBooking* JobCard::getBooking() const
{ {
return m_booking; return m_booking;
} }
/*
Function: getService
Description: Retrieves the pointer to the associated Service.
Returns:
- Service* representing the service.
*/
Service* JobCard::getService() const Service* JobCard::getService() const
{ {
return m_service; return m_service;
} }
/*
Function: getServiceId
Description: Retrieves the service ID associated with the job card.
Returns:
- const std::string& representing the service ID.
*/
const std::string& JobCard::getServiceId() const const std::string& JobCard::getServiceId() const
{ {
return m_serviceId; return m_serviceId;
} }
/*
Function: getTechnicianId
Description: Retrieves the technician ID associated with the job card.
Returns:
- const std::string& representing the technician ID.
*/
const std::string& JobCard::getTechnicianId() const const std::string& JobCard::getTechnicianId() const
{ {
return m_technicianId; return m_technicianId;
} }
/*
Function: getTechnician
Description: Retrieves the pointer to the assigned technician.
Returns:
- User* representing the technician.
*/
User* JobCard::getTechnician() const User* JobCard::getTechnician() const
{ {
return m_technician; return m_technician;
} }
/*
Function: getAssignedDate
Description: Retrieves the timestamp of when the job was assigned.
Returns:
- const util::Timestamp& representing the assigned date.
*/
const util::Timestamp& JobCard::getAssignedDate() const const util::Timestamp& JobCard::getAssignedDate() const
{ {
return m_assignedDate; return m_assignedDate;
} }
/*
Function: getStatus
Description: Retrieves the current status of the job.
Returns:
- ServiceJobStatus representing the job status.
*/
ServiceJobStatus JobCard::getStatus() const ServiceJobStatus JobCard::getStatus() const
{ {
return m_status; return m_status;
} }
/*
Function: getCompletionDate
Description: Retrieves the timestamp of when the job was completed.
Returns:
- const util::Timestamp& representing the completion date.
*/
const util::Timestamp& JobCard::getCompletionDate() const const util::Timestamp& JobCard::getCompletionDate() const
{ {
return m_completionDate; return m_completionDate;
} }
/*
Function: setId
Description: Sets the unique ID of the job card.
Parameters:
- id: New job card ID string.
Returns:
- void
*/
void JobCard::setId(const std::string& id) void JobCard::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setBookingId
Description: Sets the booking ID associated with the job card.
Parameters:
- bookingId: New booking ID string.
Returns:
- void
*/
void JobCard::setBookingId(const std::string& bookingId) void JobCard::setBookingId(const std::string& bookingId)
{ {
m_bookingId = bookingId; m_bookingId = bookingId;
} }
/*
Function: setBooking
Description: Sets the associated ServiceBooking pointer.
Parameters:
- booking: Pointer to the ServiceBooking object.
Returns:
- void
*/
void JobCard::setBooking(ServiceBooking* booking) void JobCard::setBooking(ServiceBooking* booking)
{ {
m_booking = booking; m_booking = booking;
} }
/*
Function: setService
Description: Sets the associated Service pointer.
Parameters:
- service: Pointer to the Service object.
Returns:
- void
*/
void JobCard::setService(Service* service) void JobCard::setService(Service* service)
{ {
m_service = service; m_service = service;
} }
/*
Function: setServiceId
Description: Sets the service ID associated with the job card.
Parameters:
- serviceId: New service ID string.
Returns:
- void
*/
void JobCard::setServiceId(const std::string& serviceId) void JobCard::setServiceId(const std::string& serviceId)
{ {
m_serviceId = serviceId; m_serviceId = serviceId;
} }
/*
Function: setTechnicianId
Description: Sets the technician ID associated with the job card.
Parameters:
- technicianId: New technician ID string.
Returns:
- void
*/
void JobCard::setTechnicianId(const std::string& technicianId) void JobCard::setTechnicianId(const std::string& technicianId)
{ {
m_technicianId = technicianId; m_technicianId = technicianId;
} }
/*
Function: setTechnician
Description: Sets the pointer to the assigned technician.
Parameters:
- technician: Pointer to the User object.
Returns:
- void
*/
void JobCard::setTechnician(User* technician) void JobCard::setTechnician(User* technician)
{ {
m_technician = technician; m_technician = technician;
} }
/*
Function: setAssignedDate
Description: Sets the timestamp of when the job was assigned.
Parameters:
- assignedDate: New timestamp for the assigned date.
Returns:
- void
*/
void JobCard::setAssignedDate(const util::Timestamp& assignedDate) void JobCard::setAssignedDate(const util::Timestamp& assignedDate)
{ {
m_assignedDate = assignedDate; m_assignedDate = assignedDate;
} }
/*
Function: setStatus
Description: Sets the current status of the job.
Parameters:
- status: New job status value.
Returns:
- void
*/
void JobCard::setStatus(ServiceJobStatus status) void JobCard::setStatus(ServiceJobStatus status)
{ {
m_status = status; m_status = status;
} }
/*
Function: setCompletionDate
Description: Sets the timestamp of when the job was completed.
Parameters:
- completionDate: New timestamp for the completion date.
Returns:
- void
*/
void JobCard::setCompletionDate(const util::Timestamp& completionDate) void JobCard::setCompletionDate(const util::Timestamp& completionDate)
{ {
m_completionDate = completionDate; m_completionDate = completionDate;
@@ -1,3 +1,11 @@
/*
File: JobCard.h
Description: Declares the JobCard class which represents a technicians job assignment in the Vehicle Service Management System.
Each job card includes booking details, associated service, technician information, assigned and completion dates, and job status.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Timestamp.h" #include "Timestamp.h"
@@ -1,11 +1,39 @@
/*
File: Notification.cpp
Description: Implements the Notification class which represents system notifications in the Vehicle Service Management System.
Provides constructors, accessors, and mutators for notification details such as ID, recipient, title, message, and timestamp.
Author: Trenser
Date: 19-May-2026
*/
#include "Notification.h" #include "Notification.h"
int Notification::m_uid = 0; int Notification::m_uid = 0;
/*
Function: Notification
Description: Default constructor that initializes a new notification with a unique ID and null recipient.
Parameters:
- None
Returns:
- A new Notification object.
*/
Notification::Notification() Notification::Notification()
: m_id("NOT" + std::to_string(++m_uid)), : m_id("NOT" + std::to_string(++m_uid)),
m_recipient(nullptr) {} m_recipient(nullptr) {}
/*
Function: Notification
Description: Parameterized constructor that initializes a new notification with a unique ID and specified details.
Parameters:
- recipientUserId: ID of the recipient user.
- recipient: Pointer to the User object representing the recipient.
- title: Title of the notification.
- message: Message content of the notification.
- createdAt: Timestamp of when the notification was created.
Returns:
- A new Notification object.
*/
Notification::Notification(const std::string& recipientUserId, User* recipient, const std::string& title, const std::string& message, const util::Timestamp& createdAt) Notification::Notification(const std::string& recipientUserId, User* recipient, const std::string& title, const std::string& message, const util::Timestamp& createdAt)
: m_id("NOT" + std::to_string(++m_uid)), : m_id("NOT" + std::to_string(++m_uid)),
m_recipientUserId(recipientUserId), m_recipientUserId(recipientUserId),
@@ -14,61 +42,145 @@ Notification::Notification(const std::string& recipientUserId, User* recipient,
m_message(message), m_message(message),
m_createdAt(createdAt) {} m_createdAt(createdAt) {}
/*
Function: getId
Description: Retrieves the unique ID of the notification.
Returns:
- const std::string& representing the notification ID.
*/
const std::string& Notification::getId() const const std::string& Notification::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getRecipientUserId
Description: Retrieves the recipient user ID associated with the notification.
Returns:
- const std::string& representing the recipient user ID.
*/
const std::string& Notification::getRecipientUserId() const const std::string& Notification::getRecipientUserId() const
{ {
return m_recipientUserId; return m_recipientUserId;
} }
/*
Function: getRecipient
Description: Retrieves the pointer to the recipient user.
Returns:
- User* representing the recipient.
*/
User* Notification::getRecipient() const User* Notification::getRecipient() const
{ {
return m_recipient; return m_recipient;
} }
/*
Function: getTitle
Description: Retrieves the title of the notification.
Returns:
- const std::string& representing the notification title.
*/
const std::string& Notification::getTitle() const const std::string& Notification::getTitle() const
{ {
return m_title; return m_title;
} }
/*
Function: getMessage
Description: Retrieves the message content of the notification.
Returns:
- const std::string& representing the notification message.
*/
const std::string& Notification::getMessage() const const std::string& Notification::getMessage() const
{ {
return m_message; return m_message;
} }
/*
Function: getCreatedAt
Description: Retrieves the timestamp of when the notification was created.
Returns:
- const util::Timestamp& representing the creation timestamp.
*/
const util::Timestamp& Notification::getCreatedAt() const const util::Timestamp& Notification::getCreatedAt() const
{ {
return m_createdAt; return m_createdAt;
} }
/*
Function: setId
Description: Sets the unique ID of the notification.
Parameters:
- id: New notification ID string.
Returns:
- void
*/
void Notification::setId(const std::string& id) void Notification::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setRecipientUserId
Description: Sets the recipient user ID for the notification.
Parameters:
- recipientUserId: New recipient user ID string.
Returns:
- void
*/
void Notification::setRecipientUserId(const std::string& recipientUserId) void Notification::setRecipientUserId(const std::string& recipientUserId)
{ {
m_recipientUserId = recipientUserId; m_recipientUserId = recipientUserId;
} }
/*
Function: setRecipient
Description: Sets the recipient user pointer for the notification.
Parameters:
- recipient: Pointer to the User object.
Returns:
- void
*/
void Notification::setRecipient(User* recipient) void Notification::setRecipient(User* recipient)
{ {
m_recipient = recipient; m_recipient = recipient;
} }
/*
Function: setTitle
Description: Sets the title of the notification.
Parameters:
- title: New notification title string.
Returns:
- void
*/
void Notification::setTitle(const std::string& title) void Notification::setTitle(const std::string& title)
{ {
m_title = title; m_title = title;
} }
/*
Function: setMessage
Description: Sets the message content of the notification.
Parameters:
- message: New notification message string.
Returns:
- void
*/
void Notification::setMessage(const std::string& message) void Notification::setMessage(const std::string& message)
{ {
m_message = message; m_message = message;
} }
/*
Function: setCreatedAt
Description: Sets the timestamp of when the notification was created.
Parameters:
- createdAt: New timestamp value.
Returns:
- void
*/
void Notification::setCreatedAt(const util::Timestamp& createdAt) void Notification::setCreatedAt(const util::Timestamp& createdAt)
{ {
m_createdAt = createdAt; m_createdAt = createdAt;
@@ -1,3 +1,11 @@
/*
File: Notification.h
Description: Declares the Notification class which represents system messages sent to users in the Vehicle Service Management System.
Each notification includes a unique ID, recipient details, title, message content, and timestamp of creation.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Timestamp.h" #include "Timestamp.h"
@@ -1,12 +1,40 @@
/*
File: Service.cpp
Description: Implements the Service class which represents a vehicle service in the Vehicle Service Management System.
Provides constructors, accessors, and mutators for service details such as ID, name, required inventory items,
labor cost, and state.
Author: Trenser
Date: 19-May-2026
*/
#include "Service.h" #include "Service.h"
int Service::m_uid = 0; int Service::m_uid = 0;
/*
Function: Service
Description: Default constructor that initializes a new service with a unique ID,
active state, and zero labor cost.
Parameters:
- None
Returns:
- A new Service object.
*/
Service::Service() Service::Service()
: m_id("SRV" + std::to_string(++m_uid)), : m_id("SRV" + std::to_string(++m_uid)),
m_status(util::State::ACTIVE), m_status(util::State::ACTIVE),
m_laborCost(0.0) {} m_laborCost(0.0) {}
/*
Function: Service
Description: Parameterized constructor that initializes a new service with a unique ID and specified details.
Parameters:
- name: Name of the service.
- requiredInventoryItems: Map of inventory items required for the service.
- laborCost: Labor cost associated with the service.
Returns:
- A new Service object.
*/
Service::Service(const std::string& name, const util::Map<std::string, InventoryItem*>& requiredInventoryItems, double laborCost) Service::Service(const std::string& name, const util::Map<std::string, InventoryItem*>& requiredInventoryItems, double laborCost)
: m_id("SRV" + std::to_string(++m_uid)), : m_id("SRV" + std::to_string(++m_uid)),
m_name(name), m_name(name),
@@ -14,51 +42,121 @@ Service::Service(const std::string& name, const util::Map<std::string, Inventory
m_status(util::State::ACTIVE), m_status(util::State::ACTIVE),
m_laborCost(laborCost) {} m_laborCost(laborCost) {}
/*
Function: getId
Description: Retrieves the unique ID of the service.
Returns:
- const std::string& representing the service ID.
*/
const std::string& Service::getId() const const std::string& Service::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getName
Description: Retrieves the name of the service.
Returns:
- const std::string& representing the service name.
*/
const std::string& Service::getName() const const std::string& Service::getName() const
{ {
return m_name; return m_name;
} }
/*
Function: getRequiredInventoryItems
Description: Retrieves the map of inventory items required for the service.
Returns:
- const util::Map<std::string, InventoryItem*>& representing the required inventory items.
*/
const util::Map<std::string, InventoryItem*>& Service::getRequiredInventoryItems() const const util::Map<std::string, InventoryItem*>& Service::getRequiredInventoryItems() const
{ {
return m_requiredInventoryItems; return m_requiredInventoryItems;
} }
/*
Function: getLaborCost
Description: Retrieves the labor cost associated with the service.
Returns:
- double representing the labor cost.
*/
double Service::getLaborCost() const double Service::getLaborCost() const
{ {
return m_laborCost; return m_laborCost;
} }
/*
Function: getState
Description: Retrieves the current state (ACTIVE/INACTIVE) of the service.
Returns:
- util::State representing the service state.
*/
util::State Service::getState() const util::State Service::getState() const
{ {
return m_status; return m_status;
} }
/*
Function: setId
Description: Sets the unique ID of the service.
Parameters:
- id: New service ID string.
Returns:
- void
*/
void Service::setId(const std::string& id) void Service::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setName
Description: Sets the name of the service.
Parameters:
- name: New service name string.
Returns:
- void
*/
void Service::setName(const std::string& name) void Service::setName(const std::string& name)
{ {
m_name = name; m_name = name;
} }
/*
Function: setRequiredInventoryItems
Description: Sets the inventory items required for the service.
Parameters:
- requiredInventoryItems: Map of inventory items.
Returns:
- void
*/
void Service::setRequiredInventoryItems(const util::Map<std::string, InventoryItem*>& requiredInventoryItems) void Service::setRequiredInventoryItems(const util::Map<std::string, InventoryItem*>& requiredInventoryItems)
{ {
m_requiredInventoryItems = requiredInventoryItems; m_requiredInventoryItems = requiredInventoryItems;
} }
/*
Function: setLaborCost
Description: Sets the labor cost for the service.
Parameters:
- laborCost: New labor cost value.
Returns:
- void
*/
void Service::setLaborCost(double laborCost) void Service::setLaborCost(double laborCost)
{ {
m_laborCost = laborCost; m_laborCost = laborCost;
} }
/*
Function: setState
Description: Sets the state (ACTIVE/INACTIVE) of the service.
Parameters:
- status: New state value.
Returns:
- void
*/
void Service::setState(util::State status) void Service::setState(util::State status)
{ {
m_status = status; m_status = status;
@@ -1,3 +1,12 @@
/*
File: Service.h
Description: Declares the Service class which represents a vehicle service in the Vehicle Service Management System.
Each service includes a unique ID, name, required inventory items, labor cost, and status.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,43 +1,50 @@
/* /*
File: ServiceBooking.cpp File: ServiceBooking.cpp
Description: Implementation file containing the method definitions of the Description: Implements the ServiceBooking class which represents a customers service booking in the Vehicle Service Management System.
ServiceBooking class, including constructors, getters, and setters Provides constructors, accessors, and mutators for booking details such as ID, status, services, customer,
for booking attributes. vehicle information, assigned technician, and discount percentage.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#include "ServiceBooking.h" #include "ServiceBooking.h"
int ServiceBooking::m_uid = 0; int ServiceBooking::m_uid = 0;
/* /*
Function: ServiceBooking Function: ServiceBooking
Description: Default constructor that initializes a new service booking Description: Default constructor that initializes a new service booking with a unique ID,
with a unique ID, no customer or technician, and zero discount. null customer, and zero discount percentage.
Parameter: None Parameters:
Return type: Constructor - None
Returns:
- A new ServiceBooking object.
*/ */
ServiceBooking::ServiceBooking() ServiceBooking::ServiceBooking()
: m_id("SRV" + std::to_string(++m_uid)), : m_id("SRV" + std::to_string(++m_uid)),
m_customer(nullptr), m_customer(nullptr),
m_assignedTechnician(nullptr),
m_discountPercentage(0.0) {} m_discountPercentage(0.0) {}
/* /*
Function: ServiceBooking Function: ServiceBooking
Description: Parameterized constructor that initializes a service booking Description: Parameterized constructor that initializes a new service booking with a unique ID and specified details.
with customer, vehicle, services, and discount details. Parameters:
Parameter: util::ServiceJobStatus status - current booking status - id: Booking ID string.
const util::Map<std::string, Service*>& services - map of services - status: Current status of the booking (e.g., PENDING, COMPLETED).
const std::string& customerId - ID of the customer - services: Map of services included in the booking.
User* customer - pointer to the customer object - customerId: ID of the customer.
const std::string& vehicleNumber - vehicle registration number - customer: Pointer to the User object representing the customer.
const std::string& vehicleBrand - brand of the vehicle - vehicleNumber: Vehicle registration number.
const std::string& vehicleModel - model of the vehicle - vehicleBrand: Brand of the vehicle.
double discountPercentage - discount applied to the booking - vehicleModel: Model of the vehicle.
Return type: Constructor - assignedTechnicianId: ID of the assigned technician.
- assignedTechnician: Name of the assigned technician.
- discountPercentage: Discount applied to the booking.
Returns:
- A new ServiceBooking object.
*/ */
ServiceBooking::ServiceBooking( ServiceBooking::ServiceBooking(
const std::string& id,
util::ServiceJobStatus status, util::ServiceJobStatus status,
const util::Map<std::string, const util::Map<std::string,
Service*>& services, Service*>& services,
@@ -46,6 +53,8 @@ ServiceBooking::ServiceBooking(
const std::string& vehicleNumber, const std::string& vehicleNumber,
const std::string& vehicleBrand, const std::string& vehicleBrand,
const std::string& vehicleModel, const std::string& vehicleModel,
const std::string& assignedTechnicianId,
const std::string& assignedTechnician,
double discountPercentage double discountPercentage
) )
: m_id("SRV" + std::to_string(++m_uid)), : m_id("SRV" + std::to_string(++m_uid)),
@@ -56,17 +65,17 @@ ServiceBooking::ServiceBooking(
m_vehicleNumber(vehicleNumber), m_vehicleNumber(vehicleNumber),
m_vehicleBrand(vehicleBrand), m_vehicleBrand(vehicleBrand),
m_vehicleModel(vehicleModel), m_vehicleModel(vehicleModel),
m_assignedTechnicianId(""), m_assignedTechnicianId(assignedTechnicianId),
m_assignedTechnician(nullptr), m_assignedTechnician(assignedTechnician),
m_discountPercentage(discountPercentage) m_discountPercentage(discountPercentage)
{ {
} }
/* /*
Function: getId Function: getId
Description: Retrieves the unique identifier of the service booking. Description: Retrieves the unique ID of the service booking.
Parameter: None Returns:
Return type: const std::string& - const std::string& representing the booking ID.
*/ */
const std::string& ServiceBooking::getId() const const std::string& ServiceBooking::getId() const
{ {
@@ -76,8 +85,8 @@ const std::string& ServiceBooking::getId() const
/* /*
Function: getStatus Function: getStatus
Description: Retrieves the current status of the service booking. Description: Retrieves the current status of the service booking.
Parameter: None Returns:
Return type: util::ServiceJobStatus - util::ServiceJobStatus representing the booking status.
*/ */
util::ServiceJobStatus ServiceBooking::getStatus() const util::ServiceJobStatus ServiceBooking::getStatus() const
{ {
@@ -86,9 +95,9 @@ util::ServiceJobStatus ServiceBooking::getStatus() const
/* /*
Function: getServices Function: getServices
Description: Retrieves the services associated with the booking. Description: Retrieves the map of services included in the booking.
Parameter: None Returns:
Return type: const util::Map<std::string, Service*>& - const util::Map<std::string, Service*>& representing the services.
*/ */
const util::Map<std::string, Service*>& ServiceBooking::getServices() const const util::Map<std::string, Service*>& ServiceBooking::getServices() const
{ {
@@ -98,8 +107,8 @@ const util::Map<std::string, Service*>& ServiceBooking::getServices() const
/* /*
Function: getCustomerId Function: getCustomerId
Description: Retrieves the customer ID associated with the booking. Description: Retrieves the customer ID associated with the booking.
Parameter: None Returns:
Return type: const std::string& - const std::string& representing the customer ID.
*/ */
const std::string& ServiceBooking::getCustomerId() const const std::string& ServiceBooking::getCustomerId() const
{ {
@@ -108,9 +117,9 @@ const std::string& ServiceBooking::getCustomerId() const
/* /*
Function: getCustomer Function: getCustomer
Description: Retrieves the customer object associated with the booking. Description: Retrieves the pointer to the associated customer.
Parameter: None Returns:
Return type: User* - User* representing the customer.
*/ */
User* ServiceBooking::getCustomer() const User* ServiceBooking::getCustomer() const
{ {
@@ -119,9 +128,9 @@ User* ServiceBooking::getCustomer() const
/* /*
Function: getVehicleNumber Function: getVehicleNumber
Description: Retrieves the vehicle registration number for the booking. Description: Retrieves the vehicle registration number.
Parameter: None Returns:
Return type: const std::string& - const std::string& representing the vehicle number.
*/ */
const std::string& ServiceBooking::getVehicleNumber() const const std::string& ServiceBooking::getVehicleNumber() const
{ {
@@ -130,9 +139,9 @@ const std::string& ServiceBooking::getVehicleNumber() const
/* /*
Function: getVehicleBrand Function: getVehicleBrand
Description: Retrieves the brand of the vehicle for the booking. Description: Retrieves the brand of the vehicle.
Parameter: None Returns:
Return type: const std::string& - const std::string& representing the vehicle brand.
*/ */
const std::string& ServiceBooking::getVehicleBrand() const const std::string& ServiceBooking::getVehicleBrand() const
{ {
@@ -141,9 +150,9 @@ const std::string& ServiceBooking::getVehicleBrand() const
/* /*
Function: getVehicleModel Function: getVehicleModel
Description: Retrieves the model of the vehicle for the booking. Description: Retrieves the model of the vehicle.
Parameter: None Returns:
Return type: const std::string& - const std::string& representing the vehicle model.
*/ */
const std::string& ServiceBooking::getVehicleModel() const const std::string& ServiceBooking::getVehicleModel() const
{ {
@@ -152,9 +161,9 @@ const std::string& ServiceBooking::getVehicleModel() const
/* /*
Function: getAssignedTechnicianId Function: getAssignedTechnicianId
Description: Retrieves the ID of the technician assigned to the booking. Description: Retrieves the ID of the assigned technician.
Parameter: None Returns:
Return type: const std::string& - const std::string& representing the technician ID.
*/ */
const std::string& ServiceBooking::getAssignedTechnicianId() const const std::string& ServiceBooking::getAssignedTechnicianId() const
{ {
@@ -163,19 +172,20 @@ const std::string& ServiceBooking::getAssignedTechnicianId() const
/* /*
Function: getAssignedTechnician Function: getAssignedTechnician
Description: Retrieves the technician object assigned to the booking. Description: Retrieves the name of the assigned technician.
Parameter: None Returns:
Return type: User* - const std::string& representing the technician name.
*/ */
User* ServiceBooking::getAssignedTechnician() const const std::string& ServiceBooking::getAssignedTechnician() const
{ {
return m_assignedTechnician; return m_assignedTechnician;
} }
/* /*
Function: getDiscountPercentage Function: getDiscountPercentage
Description: Retrieves the discount percentage applied to the booking. Description: Retrieves the discount percentage applied to the booking.
Parameter: None Returns:
Return type: double - double representing the discount percentage.
*/ */
double ServiceBooking::getDiscountPercentage() const double ServiceBooking::getDiscountPercentage() const
{ {
@@ -184,9 +194,11 @@ double ServiceBooking::getDiscountPercentage() const
/* /*
Function: setId Function: setId
Description: Sets the unique identifier of the service booking. Description: Sets the unique ID of the service booking.
Parameter: const std::string& id - new booking ID Parameters:
Return type: void - id: New booking ID string.
Returns:
- void
*/ */
void ServiceBooking::setId(const std::string& id) void ServiceBooking::setId(const std::string& id)
{ {
@@ -196,8 +208,10 @@ void ServiceBooking::setId(const std::string& id)
/* /*
Function: setStatus Function: setStatus
Description: Sets the current status of the service booking. Description: Sets the current status of the service booking.
Parameter: const util::ServiceJobStatus& status - new booking status Parameters:
Return type: void - status: New booking status value.
Returns:
- void
*/ */
void ServiceBooking::setStatus(const util::ServiceJobStatus& status) void ServiceBooking::setStatus(const util::ServiceJobStatus& status)
{ {
@@ -206,9 +220,11 @@ void ServiceBooking::setStatus(const util::ServiceJobStatus& status)
/* /*
Function: setServices Function: setServices
Description: Sets the services associated with the booking. Description: Sets the services included in the booking.
Parameter: const util::Map<std::string, Service*>& services - new services map Parameters:
Return type: void - services: Map of services.
Returns:
- void
*/ */
void ServiceBooking::setServices(const util::Map<std::string, Service*>& services) void ServiceBooking::setServices(const util::Map<std::string, Service*>& services)
{ {
@@ -217,9 +233,11 @@ void ServiceBooking::setServices(const util::Map<std::string, Service*>& service
/* /*
Function: setCustomerId Function: setCustomerId
Description: Sets the customer ID for the booking. Description: Sets the customer ID associated with the booking.
Parameter: const std::string& customerId - new customer ID Parameters:
Return type: void - customerId: New customer ID string.
Returns:
- void
*/ */
void ServiceBooking::setCustomerId(const std::string& customerId) void ServiceBooking::setCustomerId(const std::string& customerId)
{ {
@@ -228,9 +246,11 @@ void ServiceBooking::setCustomerId(const std::string& customerId)
/* /*
Function: setCustomer Function: setCustomer
Description: Sets the customer object for the booking. Description: Sets the pointer to the associated customer.
Parameter: User* customer - pointer to the customer object Parameters:
Return type: void - customer: Pointer to the User object.
Returns:
- void
*/ */
void ServiceBooking::setCustomer(User* customer) void ServiceBooking::setCustomer(User* customer)
{ {
@@ -239,9 +259,11 @@ void ServiceBooking::setCustomer(User* customer)
/* /*
Function: setVehicleNumber Function: setVehicleNumber
Description: Sets the vehicle registration number for the booking. Description: Sets the vehicle registration number.
Parameter: const std::string& vehicleNumber - new vehicle number Parameters:
Return type: void - vehicleNumber: New vehicle number string.
Returns:
- void
*/ */
void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber) void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber)
{ {
@@ -250,9 +272,11 @@ void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber)
/* /*
Function: setVehicleBrand Function: setVehicleBrand
Description: Sets the brand of the vehicle for the booking. Description: Sets the brand of the vehicle.
Parameter: const std::string& vehicleBrand - new vehicle brand Parameters:
Return type: void - vehicleBrand: New vehicle brand string.
Returns:
- void
*/ */
void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand) void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand)
{ {
@@ -261,9 +285,11 @@ void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand)
/* /*
Function: setVehicleModel Function: setVehicleModel
Description: Sets the model of the vehicle for the booking. Description: Sets the model of the vehicle.
Parameter: const std::string& vehicleModel - new vehicle model Parameters:
Return type: void - vehicleModel: New vehicle model string.
Returns:
- void
*/ */
void ServiceBooking::setVehicleModel(const std::string& vehicleModel) void ServiceBooking::setVehicleModel(const std::string& vehicleModel)
{ {
@@ -272,9 +298,11 @@ void ServiceBooking::setVehicleModel(const std::string& vehicleModel)
/* /*
Function: setAssignedTechnicianId Function: setAssignedTechnicianId
Description: Sets the ID of the technician assigned to the booking. Description: Sets the ID of the assigned technician.
Parameter: const std::string& assignedTechnicianId - new technician ID Parameters:
Return type: void - assignedTechnicianId: New technician ID string.
Returns:
- void
*/ */
void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnicianId) void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnicianId)
{ {
@@ -283,20 +311,24 @@ void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnici
/* /*
Function: setAssignedTechnician Function: setAssignedTechnician
Description: Sets the technician object assigned to the booking. Description: Sets the name of the assigned technician.
Parameter: User* assignedTechnician - pointer to the technician object Parameters:
Return type: void - assignedTechnician: New technician name string.
Returns:
- void
*/ */
void ServiceBooking::setAssignedTechnician(User* assignedTechnician) void ServiceBooking::setAssignedTechnician(const std::string& assignedTechnician)
{ {
m_assignedTechnician = assignedTechnician; m_assignedTechnician = assignedTechnician;
} }
/* /*
Function: setDiscountPercentage Function: setDiscountPercentage
Description: Sets the discount percentage for the booking. Description: Sets the discount percentage applied to the booking.
Parameter: double discountPercentage - new discount percentage Parameters:
Return type: void - discountPercentage: New discount percentage value.
Returns:
- void
*/ */
void ServiceBooking::setDiscountPercentage(double discountPercentage) void ServiceBooking::setDiscountPercentage(double discountPercentage)
{ {
@@ -1,11 +1,11 @@
/* /*
File: ServiceBooking.h File: ServiceBooking.h
Description: Header file declaring the ServiceBooking class, which represents Description: Declares the ServiceBooking class which represents a customers service booking in the Vehicle Service Management System.
a booking of services by a customer, including vehicle details, Each booking includes a unique ID, status, associated services, customer details, vehicle information, assigned technician, and discount percentage.
assigned technician, and discount information.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -27,11 +27,12 @@ private:
std::string m_vehicleBrand; std::string m_vehicleBrand;
std::string m_vehicleModel; std::string m_vehicleModel;
std::string m_assignedTechnicianId; std::string m_assignedTechnicianId;
User* m_assignedTechnician; std::string m_assignedTechnician;
double m_discountPercentage; double m_discountPercentage;
public: public:
ServiceBooking(); ServiceBooking();
ServiceBooking( ServiceBooking(
const std::string& id,
util::ServiceJobStatus status, util::ServiceJobStatus status,
const util::Map<std::string, const util::Map<std::string,
Service*>& services, Service*>& services,
@@ -40,6 +41,8 @@ public:
const std::string& vehicleNumber, const std::string& vehicleNumber,
const std::string& vehicleBrand, const std::string& vehicleBrand,
const std::string& vehicleModel, const std::string& vehicleModel,
const std::string& assignedTechnicianId,
const std::string& assignedTechnician,
double discountPercentage double discountPercentage
); );
const std::string& getId() const; const std::string& getId() const;
@@ -51,7 +54,7 @@ public:
const std::string& getVehicleBrand() const; const std::string& getVehicleBrand() const;
const std::string& getVehicleModel() const; const std::string& getVehicleModel() const;
const std::string& getAssignedTechnicianId() const; const std::string& getAssignedTechnicianId() const;
User* getAssignedTechnician() const; const std::string& getAssignedTechnician() const;
double getDiscountPercentage() const; double getDiscountPercentage() const;
void setId(const std::string& id); void setId(const std::string& id);
void setStatus(const util::ServiceJobStatus& status); void setStatus(const util::ServiceJobStatus& status);
@@ -62,6 +65,6 @@ public:
void setVehicleBrand(const std::string& vehicleBrand); void setVehicleBrand(const std::string& vehicleBrand);
void setVehicleModel(const std::string& vehicleModel); void setVehicleModel(const std::string& vehicleModel);
void setAssignedTechnicianId(const std::string& assignedTechnicianId); void setAssignedTechnicianId(const std::string& assignedTechnicianId);
void setAssignedTechnician(User* assignedTechnician); void setAssignedTechnician(const std::string& assignedTechnician);
void setDiscountPercentage(double discountPercentage); void setDiscountPercentage(double discountPercentage);
}; };
@@ -1,14 +1,45 @@
/*
File: User.cpp
Description: Implements the User class which represents system users in the Vehicle Service Management System.
Provides constructors, destructor, accessors, and mutators for user details such as ID, username,
password, name, phone, email, role, state, and notifications.
Author: Trenser
Date: 19-May-2026
*/
#include "User.h" #include "User.h"
#include "Notification.h" #include "Notification.h"
#include "Enums.h" #include "Enums.h"
int User::m_uid = 0; int User::m_uid = 0;
/*
Function: User
Description: Default constructor that initializes a new user with a unique ID,
default role as CUSTOMER, and active state.
Parameters:
- None
Returns:
- A new User object.
*/
User::User() User::User()
: m_id("USR" + std::to_string(++m_uid)), : m_id("USR" + std::to_string(++m_uid)),
m_type(util::UserType::CUSTOMER), m_type(util::UserType::CUSTOMER),
m_status(util::State::ACTIVE) {} m_status(util::State::ACTIVE) {}
/*
Function: User
Description: Parameterized constructor that initializes a new user with a unique ID and specified details.
Parameters:
- userName: Username for login.
- password: Password for authentication.
- name: Full name of the user.
- phone: Phone number of the user.
- email: Email address of the user.
- role: Role of the user (CUSTOMER, ADMIN, TECHNICIAN, etc.).
Returns:
- A new User object.
*/
User::User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role) User::User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role)
: m_id("USR" + std::to_string(++m_uid)), : m_id("USR" + std::to_string(++m_uid)),
m_userName(userName), m_userName(userName),
@@ -19,6 +50,14 @@ User::User(const std::string& userName, const std::string& password, const std::
m_type(role), m_type(role),
m_status(util::State::ACTIVE) {} m_status(util::State::ACTIVE) {}
/*
Function: ~User
Description: Destructor that cleans up dynamically allocated notifications associated with the user.
Parameters:
- None
Returns:
- void
*/
User::~User() User::~User()
{ {
for (int index = 0; index < m_notifications.getSize(); index++) for (int index = 0; index < m_notifications.getSize(); index++)
@@ -27,96 +66,221 @@ User::~User()
} }
} }
/*
Function: getId
Description: Retrieves the unique ID of the user.
Returns:
- const std::string& representing the user ID.
*/
const std::string& User::getId() const const std::string& User::getId() const
{ {
return m_id; return m_id;
} }
/*
Function: getUserName
Description: Retrieves the username of the user.
Returns:
- const std::string& representing the username.
*/
const std::string& User::getUserName() const const std::string& User::getUserName() const
{ {
return m_userName; return m_userName;
} }
/*
Function: getPassword
Description: Retrieves the password of the user.
Returns:
- const std::string& representing the password.
*/
const std::string& User::getPassword() const const std::string& User::getPassword() const
{ {
return m_password; return m_password;
} }
/*
Function: getName
Description: Retrieves the full name of the user.
Returns:
- const std::string& representing the name.
*/
const std::string& User::getName() const const std::string& User::getName() const
{ {
return m_name; return m_name;
} }
/*
Function: getPhone
Description: Retrieves the phone number of the user.
Returns:
- const std::string& representing the phone number.
*/
const std::string& User::getPhone() const const std::string& User::getPhone() const
{ {
return m_phone; return m_phone;
} }
/*
Function: getEmail
Description: Retrieves the email address of the user.
Returns:
- const std::string& representing the email.
*/
const std::string& User::getEmail() const const std::string& User::getEmail() const
{ {
return m_email; return m_email;
} }
/*
Function: getNotifications
Description: Retrieves the map of notifications associated with the user.
Returns:
- util::Map<std::string, Notification*>& representing the notifications.
*/
util::Map<std::string, Notification*>& User::getNotifications() util::Map<std::string, Notification*>& User::getNotifications()
{ {
return m_notifications; return m_notifications;
} }
/*
Function: getUserType
Description: Retrieves the role of the user.
Returns:
- util::UserType representing the user role.
*/
util::UserType User::getUserType() const util::UserType User::getUserType() const
{ {
return m_type; return m_type;
} }
/*
Function: getState
Description: Retrieves the current state (ACTIVE/INACTIVE) of the user.
Returns:
- util::State representing the user state.
*/
util::State User::getState() const util::State User::getState() const
{ {
return m_status; return m_status;
} }
/*
Function: setId
Description: Sets the unique ID of the user.
Parameters:
- id: New user ID string.
Returns:
- void
*/
void User::setId(const std::string& id) void User::setId(const std::string& id)
{ {
m_id = id; m_id = id;
} }
/*
Function: setUserName
Description: Sets the username of the user.
Parameters:
- userName: New username string.
Returns:
- void
*/
void User::setUserName(const std::string& userName) void User::setUserName(const std::string& userName)
{ {
m_userName = userName; m_userName = userName;
} }
/*
Function: setPassword
Description: Sets the password of the user.
Parameters:
- password: New password string.
Returns:
- void
*/
void User::setPassword(const std::string& password) void User::setPassword(const std::string& password)
{ {
m_password = password; m_password = password;
} }
/*
Function: setName
Description: Sets the full name of the user.
Parameters:
- name: New name string.
Returns:
- void
*/
void User::setName(const std::string& name) void User::setName(const std::string& name)
{ {
m_name = name; m_name = name;
} }
/*
Function: setPhone
Description: Sets the phone number of the user.
Parameters:
- phone: New phone number string.
Returns:
- void
*/
void User::setPhone(const std::string& phone) void User::setPhone(const std::string& phone)
{ {
m_phone = phone; m_phone = phone;
} }
/*
Function: setEmail
Description: Sets the email address of the user.
Parameters:
- email: New email string.
Returns:
- void
*/
void User::setEmail(const std::string& email) void User::setEmail(const std::string& email)
{ {
m_email = email; m_email = email;
} }
/*
Function: addNotification
Description: Adds a new notification to the users notification map.
Parameters:
- notification: Pointer to the Notification object.
Returns:
- void
*/
void User::addNotification(Notification* notification) void User::addNotification(Notification* notification)
{ {
m_notifications.insert(notification->getId(), notification); if (notification)
{
m_notifications.insert(notification->getId(), notification);
}
} }
/*
Function: setRole
Description: Sets the role of the user.
Parameters:
- role: New user role value.
Returns:
- void
*/
void User::setRole(util::UserType role) void User::setRole(util::UserType role)
{ {
m_type = role; m_type = role;
} }
/*
Function: setState
Description: Sets the state (ACTIVE/INACTIVE) of the user.
Parameters:
- status: New state value.
Returns:
- void
*/
void User::setState(util::State status) void User::setState(util::State status)
{ {
m_status = status; m_status = status;
} }
void User::update(Notification* notification)
{
}
@@ -1,3 +1,12 @@
/*
File: User.h
Description: Declares the User class which represents system users in the Vehicle Service Management System.
Each user has a unique ID, credentials, personal details, notifications, role type, and status.
The User class also implements the Observer interface to handle notifications.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -38,8 +47,7 @@ public:
void setName(const std::string& name); void setName(const std::string& name);
void setPhone(const std::string& phone); void setPhone(const std::string& phone);
void setEmail(const std::string& email); void setEmail(const std::string& email);
void addNotification(Notification* notification); void addNotification(Notification* notification) override;
void setRole(util::UserType role); void setRole(util::UserType role);
void setState(util::State status); void setState(util::State status);
void update(Notification* notification) override;
}; };
@@ -1,81 +1,3 @@
/*
File: AuthenticationManagementService.cpp
Description: Implementation file containing the method definitions of the
AuthenticationManagementService class, including login, logout,
password change, and retrieval of the authenticated user.
Author: Trenser
Date:19-May-2026
*/
#include <stdexcept>
#include "AuthenticationManagementService.h" #include "AuthenticationManagementService.h"
#include "User.h"
User* AuthenticationManagementService::m_authenticatedUser = nullptr; User* AuthenticationManagementService::m_authenticatedUser = nullptr;
/*
Function: login
Description: Authenticates a user by checking the provided username and password
against the stored users in the DataStore. If successful, sets the
authenticated user.
Parameter: const std::string& username - users username
const std::string& password - users password
Return type: bool - true if login successful, false otherwise
*/
bool AuthenticationManagementService::login(const std::string& username, const std::string& password)
{
util::Map<std::string, User*> users = m_dataStore.getUsers();
int usersMapSize = users.getSize();
for (int index = 0; index < usersMapSize; index++)
{
User* user = users.getValueAt(index);
if (username == user->getUserName())
{
if (password == user->getPassword())
{
m_authenticatedUser = user;
return true;
}
return false;
}
}
return false;
}
/*
Function: getAuthenticatedUser
Description: Retrieves the currently authenticated user.
Parameter: None
Return type: User* - pointer to the authenticated user
*/
User* AuthenticationManagementService::getAuthenticatedUser()
{
return m_authenticatedUser;
}
/*
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)
{
throw std::runtime_error("There is no user currently logged in!");
}
m_authenticatedUser->setPassword(newPassword);
}
@@ -1,11 +1,11 @@
/* /*
File: AuthenticationManagementService.h File: AuthenticationManagementService.h
Description: Header file declaring the AuthenticationManagementService class, which manages Description: Declares the AuthenticationManagementService class which manages user authentication in the Vehicle Service Management System.
user authentication, login, logout, password changes, and retrieval of the Provides functionality for login, logout, password change, and retrieving the currently authenticated user.
authenticated user.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include <string> #include <string>
#include "DataStore.h" #include "DataStore.h"
@@ -1 +1,105 @@
#include <stdexcept>
#include "InventoryManagementService.h" #include "InventoryManagementService.h"
#include "Vector.h"
#include "Enums.h"
#include "InventoryItem.h"
#include "Config.h"
#include "User.h"
#include "Factory.h"
#include "Timestamp.h"
util::Map<std::string, User*> InventoryManagementService::m_observers{};
void InventoryManagementService::attach(User* user)
{
if (user)
{
const std::string& userID = user->getId();
if (m_observers.find(userID) == -1)
{
m_observers[userID] = user;
}
}
}
void InventoryManagementService::detach(User* user)
{
if (user)
{
const std::string& userID = user->getId();
if (m_observers.find(userID) != -1)
{
m_observers.remove(userID);
}
}
}
void InventoryManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
{
if (user)
{
if (m_observers.find(user->getId()) != -1)
{
Notification* notification =
Factory::getObject<Notification>(
user->getId(),
user,
"InventoryManagementService: " + title,
message,
util::Timestamp()
);
if (notification)
{
user->addNotification(notification);
}
else
{
throw std::runtime_error("Failed to create notification");
}
}
}
}
static void sendLowStockAlertsToAdmins(InventoryManagementService& inventoryManagementService, const InventoryItem* inventoryItem, const util::Vector<User*>& adminUsers)
{
int adminUsersSize = adminUsers.getSize();
for (int index = 0; index < adminUsersSize; index++)
{
inventoryManagementService.sendNotification(
adminUsers[index],
"Low Stock Alert",
"The inventory item with ID " + inventoryItem->getId() +
" has very low quantity in the inventory"
);
}
}
void InventoryManagementService::sendLowStockAlerts()
{
auto& inventoryItems = m_dataStore.getInventoryItems();
int inventoryItemsSize = inventoryItems.getSize();
auto& usersMap = m_dataStore.getUsers();
int usersMapSize = usersMap.getSize();
util::Vector<User*> adminUsers;
for (int index = 0; index < usersMapSize; index++)
{
User* user = usersMap.getValueAt(index);
if (user->getUserType() == util::UserType::ADMIN)
{
adminUsers.push_back(user);
}
}
int adminUsersSize = adminUsers.getSize();
if (adminUsersSize < 1)
{
throw std::runtime_error("The system has no admins present!");
}
for (int index = 0; index <= inventoryItemsSize; index++)
{
InventoryItem* inventoryItem = inventoryItems.getValueAt(index);
if (inventoryItem && inventoryItem->getQuantity() < config::threshold::INVENTORY_LOW_STOCK_THRESHOLD)
{
sendLowStockAlertsToAdmins(*this, inventoryItem, adminUsers);
}
}
}
@@ -1,3 +1,11 @@
/*
File: InventoryManagementService.h
Description: Declares the InventoryManagementService class which manages inventory operations in the Vehicle Service Management System.
Provides functionality to retrieve, add, and remove inventory items, send low stock alerts, and handle notifications using the Observer pattern.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,6 +1,15 @@
/*
File: NotificationManagementService.h
Description: Declares the NotificationManagementService abstract class which defines the contract for managing notifications in the Vehicle Service Management System.
Implements the Subject interface and provides pure virtual methods for sending notifications and managing user subscriptions (attach/detach).
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Subject.h" #include "Subject.h"
#include "Notification.h"
#include "User.h" #include "User.h"
class NotificationManagementService : public Subject class NotificationManagementService : public Subject
@@ -1 +1,136 @@
/*
File: PaymentManagementService.cpp
Description: Implements the PaymentManagementService class which manages payment-related operations
in the Vehicle Service Management System. Provides functionality for attaching/detaching observers,
sending notifications, and issuing payment reminders based on invoice status and thresholds.
Author: Trenser
Date: 20-May-2026
*/
#include <stdexcept>
#include "PaymentManagementService.h" #include "PaymentManagementService.h"
#include "Invoice.h"
#include "ServiceBooking.h"
#include "Enums.h"
#include "Timestamp.h"
#include "Config.h"
#include "User.h"
#include "Factory.h"
util::Map<std::string, User*> PaymentManagementService::m_observers{};
/*
Function: attach
Description: Attaches a user as an observer to the PaymentManagementService for receiving notifications.
Parameters:
- user: Pointer to the User object to be attached.
Returns:
- void
*/
void PaymentManagementService::attach(User* user)
{
if (user)
{
const std::string& userID = user->getId();
if (m_observers.find(userID) == -1)
{
m_observers[userID] = user;
}
}
}
/*
Function: detach
Description: Detaches a user from the observer list of the PaymentManagementService.
Parameters:
- user: Pointer to the User object to be detached.
Returns:
- void
*/
void PaymentManagementService::detach(User* user)
{
if (user)
{
const std::string& userID = user->getId();
if (m_observers.find(userID) != -1)
{
m_observers.remove(userID);
}
}
}
/*
Function: sendNotification
Description: Sends a notification to a user if they are registered as an observer.
Parameters:
- user: Pointer to the User object to receive the notification.
- title: Title of the notification.
- message: Message content of the notification.
Returns:
- void
Throws:
- std::runtime_error if notification creation fails.
*/
void PaymentManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
{
if (user)
{
if (m_observers.find(user->getId()) != -1)
{
Notification* notification =
Factory::getObject<Notification>(
user->getId(),
user,
"PaymentManagementService: " + title,
message,
util::Timestamp()
);
if (notification)
{
user->addNotification(notification);
}
else
{
throw std::runtime_error("Failed to create notification");
}
}
}
}
/*
Function: sendPaymentReminders
Description: Iterates through all invoices in the datastore and sends payment reminders to customers
whose invoices are pending beyond the configured threshold duration.
Parameters:
- None
Returns:
- void
*/
void PaymentManagementService::sendPaymentReminders()
{
auto& invoicesMap = m_dataStore.getInvoices();
int invoicesMapSize = invoicesMap.getSize();
for (int index = 0; index < invoicesMapSize; index++)
{
const Invoice* invoice = invoicesMap.getValueAt(index);
if (invoice && invoice->getStatus() == util::PaymentStatus::PENDING)
{
util::Timestamp invoiceCreationTimestamp = invoice->getInvoiceDate();
util::Timestamp currentTimestamp;
if (util::Timestamp::getDurationInHours(invoiceCreationTimestamp, currentTimestamp) >= config::threshold::PAYMENT_REMINDER_THRESHOLD_HOURS)
{
const ServiceBooking* serviceBooking = invoice->getBooking();
if (serviceBooking)
{
User* customer = serviceBooking->getCustomer();
if (customer)
{
sendNotification(customer,
"Payment Reminder",
"Your payment for Invoice ID " + invoice->getId() + " is still pending.Please complete the payment." + invoice->getId());
}
}
}
}
}
}
@@ -1,3 +1,12 @@
/*
File: PaymentManagementService.h
Description: Declares the PaymentManagementService class which manages payment operations in the Vehicle Service Management System.
Provides functionality to generate invoices, retrieve customer invoices, complete payments, send payment reminders,
and handle notifications using the Observer pattern.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,98 +1,94 @@
/* /*
File: ServiceManagementService.cpp File: ServiceManagementService.cpp
Description: Implementation file containing the method definitions of the Description: Implements the ServiceManagementService class which manages service-related operations
ServiceManagementService class, including service and combo package in the Vehicle Service Management System. Provides functionality for attaching/detaching observers
purchasing logic, booking creation, and notification handling. and sending notifications to users regarding service events.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 20-May-2026
*/ */
#include <stdexcept> #include <stdexcept>
#include "ServiceManagementService.h" #include "ServiceManagementService.h"
#include "AuthenticationManagementService.h" #include "User.h"
#include "Service.h"
#include "ServiceBooking.h"
#include "ComboPackage.h"
#include "Factory.h" #include "Factory.h"
#include "Timestamp.h"
util::Map<std::string, User*> ServiceManagementService::m_observers{};
/* /*
Function: purchaseService Function: attach
Description: Creates a new service booking for the authenticated user. Validates Description: Attaches a user as an observer to the ServiceManagementService for receiving notifications.
service IDs, retrieves services from the DataStore, and generates a Parameters:
booking. Sends a notification upon successful booking. - user: Pointer to the User object to be attached.
Parameter: const util::Vector<std::string>& serviceIDs - IDs of services to purchase Returns:
const std::string& vehicleNumber - vehicle registration number - void
const std::string& vehicleBrand - brand of the vehicle
const std::string& vehicleModel - model of the vehicle
Return type: void
*/ */
void ServiceManagementService::purchaseService(const util::Vector<std::string>& serviceIDs, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel) void ServiceManagementService::attach(User* user)
{ {
AuthenticationManagementService m_authenticationManagementService; if (user)
auto authenticatedUser = m_authenticationManagementService.getAuthenticatedUser();
if (authenticatedUser == nullptr)
{ {
throw std::runtime_error("No user is currently logged in!"); const std::string& userID = user->getId();
} if (m_observers.find(userID) == -1)
auto& servicesMap = m_dataStore.getServices();
auto& serviceBookingMap = m_dataStore.getServiceBookings();
util::Map<std::string, Service*> selectedServices;
int selectedServicesCount = serviceIDs.getSize();
for (int index = 0; index < selectedServicesCount; index++)
{
int serviceIndex = servicesMap.find(serviceIDs[index]);
if (serviceIndex == -1)
{ {
throw std::runtime_error("Service not found!"); m_observers[userID] = user;
} }
Service* service = servicesMap.getValueAt(serviceIndex);
selectedServices[service->getId()] = service;
} }
ServiceBooking* serviceBooking = Factory::getObject<ServiceBooking>(util::ServiceJobStatus::STARTED, selectedServices, authenticatedUser->getId(), authenticatedUser, vehicleNumber, vehicleBrand, vehicleModel, 0);
if (serviceBooking == nullptr)
{
throw std::runtime_error("Failed to create service booking");
}
serviceBookingMap[serviceBooking->getId()] = serviceBooking;
sendNotification(authenticatedUser,
"Service Booking succeeded",
"Your service booking has been successfully placed with ID " + serviceBooking->getId());
} }
/* /*
Function: purchaseComboPackage Function: detach
Description: Creates a new service booking for a combo package. Validates the combo Description: Detaches a user from the observer list of the ServiceManagementService.
package ID, retrieves services from the package, and generates a booking Parameters:
with the applicable discount. Sends a notification upon successful booking. - user: Pointer to the User object to be detached.
Parameter: const std::string& comboPackageID - ID of the combo package Returns:
const std::string& vehicleNumber - vehicle registration number - void
const std::string& vehicleBrand - brand of the vehicle
const std::string& vehicleModel - model of the vehicle
Return type: void
*/ */
void ServiceManagementService::purchaseComboPackage(const std::string& comboPackageID, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel) void ServiceManagementService::detach(User* user)
{ {
AuthenticationManagementService m_authenticationManagementService; if (user)
auto authenticatedUser = m_authenticationManagementService.getAuthenticatedUser();
if (authenticatedUser == nullptr)
{ {
throw std::runtime_error("No user is currently logged in!"); const std::string& userID = user->getId();
if (m_observers.find(userID) != -1)
{
m_observers.remove(userID);
}
}
}
/*
Function: sendNotification
Description: Sends a notification to a user if they are registered as an observer.
Parameters:
- user: Pointer to the User object to receive the notification.
- title: Title of the notification.
- message: Message content of the notification.
Returns:
- void
Throws:
- std::runtime_error if notification creation fails.
*/
void ServiceManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
{
if (user)
{
if (m_observers.find(user->getId()) != -1)
{
Notification* notification =
Factory::getObject<Notification>(
user->getId(),
user,
"ServiceManagementService: " + title,
message,
util::Timestamp()
);
if (notification)
{
user->addNotification(notification);
}
else
{
throw std::runtime_error("Failed to create notification");
}
}
} }
auto& comboPackagesMap = m_dataStore.getComboPackages();
auto& serviceBookingMap = m_dataStore.getServiceBookings();
int comboPackageIndex = comboPackagesMap.find(comboPackageID);
if (comboPackageIndex == -1)
{
throw std::runtime_error("Combo Package not found!");
}
const ComboPackage* comboPackage = comboPackagesMap[comboPackageID];
util::Map<std::string, Service*> selectedServices = comboPackage->getServices();
ServiceBooking* serviceBooking = Factory::getObject<ServiceBooking>(util::ServiceJobStatus::STARTED, selectedServices, authenticatedUser->getId(), authenticatedUser, vehicleNumber, vehicleBrand, vehicleModel, comboPackage->getDiscountPercentage());
if (serviceBooking == nullptr)
{
throw std::runtime_error("Failed to create combo package service booking");
}
serviceBookingMap[serviceBooking->getId()] = serviceBooking;
sendNotification(authenticatedUser,
"Combo Package Service Booking succeeded",
"Your service booking for the combo package has been successfully placed with ID " + serviceBooking->getId());
} }
@@ -1,11 +1,12 @@
/* /*
File: ServiceManagementService.h File: ServiceManagementService.h
Description: Header file declaring the ServiceManagementService class, which manages Description: Declares the ServiceManagementService class which manages services, combo packages, service bookings, and job cards
services, combo packages, job cards, and service bookings. Inherits from in the Vehicle Service Management System. Provides functionality to purchase services or packages, create and remove
NotificationManagementService to handle notifications. services, assign and complete jobs, cancel bookings, and handle notifications using the Observer pattern.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -1,112 +1,75 @@
/* /*
File: UserManagementService.cpp File: UserManagementService.cpp
Description: Implementation file containing the method definitions of the Description: Implements the UserManagementService class which manages user-related operations
UserManagementService class, including user creation, updates, in the Vehicle Service Management System. Provides functionality for retrieving user notifications
and ensuring an admin account exists. and deleting notifications by ID.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 20-May-2026
*/ */
#include <stdexcept> #include <stdexcept>
#include "User.h"
#include "Enums.h"
#include "Config.h"
#include "UserManagementService.h" #include "UserManagementService.h"
#include "ServiceManagementService.h" #include "User.h"
#include "PaymentManagementService.h" #include "Vector.h"
#include "InventoryManagementService.h"
#include "Factory.h"
/* /*
Function: ensureAdminExists Function: getUserNotifications
Description: Ensures that at least one admin user exists in the system. Description: Retrieves all notifications associated with a given user ID.
If no admin is found, creates a default admin user using Parameters:
configuration constants. - userID: The unique ID of the user whose notifications are to be retrieved.
Parameter: None Returns:
Return type: void - util::Vector<Notification*> containing all notifications for the user.
Throws:
- std::runtime_error if no user is found with the given UserID or if the User object is invalid.
*/ */
void UserManagementService::ensureAdminExists() util::Vector<Notification*> UserManagementService::getUserNotifications(const std::string& userID)
{ {
auto& usersMap = m_dataStore.getUsers(); auto& usersMap = m_dataStore.getUsers();
int usersMapSize = usersMap.getSize(); if (usersMap.find(userID) == -1)
bool isAdminFound = false;
for (int index = 0; index < usersMapSize; index++)
{ {
User* user = usersMap.getValueAt(index); throw std::runtime_error("No user found with given UserID");
if (user && user->getUserType() == util::UserType::ADMIN) }
User* user = usersMap[userID];
if (user)
{
auto& notifications = user->getNotifications();
int numberOfNotifications = notifications.getSize();
util::Vector<Notification*> notificationsVector;
for (int index = 0; index < numberOfNotifications; index++)
{ {
isAdminFound = true; notificationsVector.push_back(notifications.getValueAt(index));
break;
} }
return notificationsVector;
} }
if (!isAdminFound) else
{ {
createUser( throw std::runtime_error("Invalid User object");
config::admin::DEFAULT_ADMIN_USERNAME,
config::admin::DEFAULT_ADMIN_NAME,
config::admin::DEFAULT_ADMIN_PASSWORD,
config::admin::DEFAULT_ADMIN_EMAIL,
config::admin::DEFAULT_ADMIN_PHONE,
util::UserType::ADMIN);
} }
} }
/* /*
Function: createUser Function: deleteNotification
Description: Creates a new user with the provided details. Validates that Description: Deletes a specific notification associated with a given user ID.
the username is unique, then attaches the user to relevant Parameters:
management services (payment, service, inventory). - notificationID: The unique ID of the notification to be deleted.
Parameter: const std::string& username - users username - userID: The unique ID of the user whose notification is to be deleted.
const std::string& name - users name Returns:
const std::string& password - users password - void
const std::string& email - users email address Throws:
const std::string& phone - users phone number - std::runtime_error if no user is found with the given UserID or if no notification is found with the given NotificationID.
util::UserType type - type of user (ADMIN, CUSTOMER, TECHNICIAN)
Return type: void
*/ */
void UserManagementService::createUser(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phone, util::UserType type) void UserManagementService::deleteNotification(const std::string& notificationID, const std::string& userID)
{
InventoryManagementService inventoryManagementService;
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)
{
throw std::runtime_error("Username already exists");
}
User* newUser = Factory::getObject<User>(username, password, name, phone, email, type);
usersMap.insert(newUser->getId(), newUser);
paymentManagementService.attach(newUser);
serviceManagementService.attach(newUser);
if (newUser->getUserType() == util::UserType::ADMIN)
{
inventoryManagementService.attach(newUser);
}
}
/*
Function: updateUserDetails
Description: Updates the email and phone details of an existing user.
Throws an exception if the user does not exist.
Parameter: const std::string& userID - ID of the user to update
const std::string& email - new email address
const std::string& phone - new phone number
Return type: void
*/
void UserManagementService::updateUserDetails(const std::string& userID, const std::string& email, const std::string& phone)
{ {
auto& usersMap = m_dataStore.getUsers(); auto& usersMap = m_dataStore.getUsers();
int index = usersMap.find(userID); if (usersMap.find(userID) == -1)
if (index == -1)
{ {
throw std::runtime_error("User does not exist!"); throw std::runtime_error("No user found with given UserID");
} }
User* user = usersMap.getValueAt(index); User* user = usersMap[userID];
user->setEmail(email); auto& notifications = user->getNotifications();
user->setPhone(phone); if (notifications.find(notificationID) == -1)
} {
throw std::runtime_error("No notification found with given NotificationID");
}
notifications.remove(notificationID);
}
@@ -1,11 +1,11 @@
/* /*
File: UserManagementService.h File: UserManagementService.h
Description: Header file declaring the UserManagementService class, which manages Description: Declares the UserManagementService class which manages user-related operations in the Vehicle Service Management System.
user creation, updates, retrieval, removal, notifications, and ensures Provides functionality to create, update, retrieve, and remove users, as well as manage user notifications.
the existence of an admin account.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
@@ -21,13 +21,12 @@ private:
DataStore& m_dataStore; DataStore& m_dataStore;
public: public:
UserManagementService() : m_dataStore(DataStore::getInstance()) {} UserManagementService() : m_dataStore(DataStore::getInstance()) {}
void createUser(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phone, util::UserType type); void createUser(const std::string& username, const std::string& password, const std::string& email, const std::string& phone, util::UserType type);
void updateUserDetails(const std::string& userID, const std::string& email, const std::string& phone); void updateUserDetails(const std::string& userID, const std::string& email, const std::string& phone);
util::Map<std::string, User*> getUsers(); util::Map<std::string, User*> getUsers();
util::Map<std::string, User*> getUsers(util::UserType type); util::Map<std::string, User*> getUsers(util::UserType type);
User* getUser(const std::string& userID); User* getUser (const std::string& userID);
void removeUser(const std::string& userID); void removeUser(const std::string& userID);
util::Vector<Notification*> getUserNotifications(const std::string& userID); util::Vector<Notification*> getUserNotifications(const std::string& userID);
void deleteNotification(const std::string& notificationID, const std::string& userID); void deleteNotification(const std::string& notificationID, const std::string& userID);
void ensureAdminExists();
}; };
@@ -1,21 +1,18 @@
/* /*
File: Config.h File: Config.h
Description: Header file declaring configuration constants for the Vehicle Service System. Description: Defines configuration constants for system thresholds in the Vehicle Service Management System.
Includes default admin account details such as username, name, password, Includes limits for inventory stock alerts and payment reminder intervals.
email, and phone number.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 21-May-2026
*/ */
#pragma once #pragma once
namespace config namespace config
{ {
namespace admin namespace threshold
{ {
constexpr const char* DEFAULT_ADMIN_USERNAME = "admin"; constexpr int INVENTORY_LOW_STOCK_THRESHOLD = 5;
constexpr const char* DEFAULT_ADMIN_NAME = "admin"; constexpr int PAYMENT_REMINDER_THRESHOLD_HOURS = 168;
constexpr const char* DEFAULT_ADMIN_PASSWORD = "";
constexpr const char* DEFAULT_ADMIN_EMAIL = "admin@vss";
constexpr const char* DEFAULT_ADMIN_PHONE = "0000000000";
} }
} }
@@ -1,3 +1,12 @@
/*
File: Enums.h
Description: Declares enumerations and utility functions for user types, payment modes, payment status,
service job status, and state management in the Vehicle Service Management System.
Provides string conversion and parsing functions for each enum type.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include <stdexcept> #include <stdexcept>
@@ -34,6 +43,14 @@ namespace util
INACTIVE INACTIVE
}; };
/*
Function: getUserTypeString
Description: Converts a UserType enum value to its corresponding string representation.
Parameters:
- type: UserType enum value.
Returns:
- std::string representing the UserType.
*/
inline std::string getUserTypeString(UserType type) inline std::string getUserTypeString(UserType type)
{ {
switch (type) switch (type)
@@ -48,6 +65,16 @@ namespace util
throw std::invalid_argument("Invalid UserType"); throw std::invalid_argument("Invalid UserType");
} }
/*
Function: getUserType
Description: Converts a string value to its corresponding UserType enum.
Parameters:
- value: std::string representing the UserType.
Returns:
- UserType enum value.
Throws:
- std::invalid_argument if the string does not match a valid UserType.
*/
inline UserType getUserType(const std::string& value) inline UserType getUserType(const std::string& value)
{ {
if (value == "ADMIN") if (value == "ADMIN")
@@ -65,6 +92,14 @@ namespace util
throw std::invalid_argument("Invalid UserType string"); throw std::invalid_argument("Invalid UserType string");
} }
/*
Function: getPaymentModeString
Description: Converts a PaymentMode enum value to its corresponding string representation.
Parameters:
- mode: PaymentMode enum value.
Returns:
- std::string representing the PaymentMode.
*/
inline std::string getPaymentModeString(PaymentMode mode) inline std::string getPaymentModeString(PaymentMode mode)
{ {
switch (mode) switch (mode)
@@ -77,6 +112,16 @@ namespace util
throw std::invalid_argument("Invalid PaymentMode"); throw std::invalid_argument("Invalid PaymentMode");
} }
/*
Function: getPaymentMode
Description: Converts a string value to its corresponding PaymentMode enum.
Parameters:
- value: std::string representing the PaymentMode.
Returns:
- PaymentMode enum value.
Throws:
- std::invalid_argument if the string does not match a valid PaymentMode.
*/
inline PaymentMode getPaymentMode(const std::string& value) inline PaymentMode getPaymentMode(const std::string& value)
{ {
if (value == "ONLINE") if (value == "ONLINE")
@@ -90,6 +135,14 @@ namespace util
throw std::invalid_argument("Invalid PaymentMode string"); throw std::invalid_argument("Invalid PaymentMode string");
} }
/*
Function: getPaymentStatusString
Description: Converts a PaymentStatus enum value to its corresponding string representation.
Parameters:
- status: PaymentStatus enum value.
Returns:
- std::string representing the PaymentStatus.
*/
inline std::string getPaymentStatusString(PaymentStatus status) inline std::string getPaymentStatusString(PaymentStatus status)
{ {
switch (status) switch (status)
@@ -102,6 +155,16 @@ namespace util
throw std::invalid_argument("Invalid PaymentStatus"); throw std::invalid_argument("Invalid PaymentStatus");
} }
/*
Function: getPaymentStatus
Description: Converts a string value to its corresponding PaymentStatus enum.
Parameters:
- value: std::string representing the PaymentStatus.
Returns:
- PaymentStatus enum value.
Throws:
- std::invalid_argument if the string does not match a valid PaymentStatus.
*/
inline PaymentStatus getPaymentStatus(const std::string& value) inline PaymentStatus getPaymentStatus(const std::string& value)
{ {
if (value == "PENDING") if (value == "PENDING")
@@ -117,6 +180,14 @@ namespace util
throw std::invalid_argument("Invalid PaymentStatus string"); throw std::invalid_argument("Invalid PaymentStatus string");
} }
/*
Function: getServiceJobStatusString
Description: Converts a ServiceJobStatus enum value to its corresponding string representation.
Parameters:
- status: ServiceJobStatus enum value.
Returns:
- std::string representing the ServiceJobStatus.
*/
inline std::string getServiceJobStatusString(ServiceJobStatus status) inline std::string getServiceJobStatusString(ServiceJobStatus status)
{ {
switch (status) switch (status)
@@ -129,6 +200,16 @@ namespace util
throw std::invalid_argument("Invalid ServiceJobStatus"); throw std::invalid_argument("Invalid ServiceJobStatus");
} }
/*
Function: getServiceJobStatus
Description: Converts a string value to its corresponding ServiceJobStatus enum.
Parameters:
- value: std::string representing the ServiceJobStatus.
Returns:
- ServiceJobStatus enum value.
Throws:
- std::invalid_argument if the string does not match a valid ServiceJobStatus.
*/
inline ServiceJobStatus getServiceJobStatus(const std::string& value) inline ServiceJobStatus getServiceJobStatus(const std::string& value)
{ {
if (value == "STARTED") if (value == "STARTED")
@@ -142,6 +223,14 @@ namespace util
throw std::invalid_argument("Invalid ServiceJobStatus string"); throw std::invalid_argument("Invalid ServiceJobStatus string");
} }
/*
Function: getStateString
Description: Converts a State enum value to its corresponding string representation.
Parameters:
- status: State enum value.
Returns:
- std::string representing the State.
*/
inline std::string getStateString(State status) inline std::string getStateString(State status)
{ {
switch (status) switch (status)
@@ -154,6 +243,16 @@ namespace util
throw std::invalid_argument("Invalid State"); throw std::invalid_argument("Invalid State");
} }
/*
Function: getState
Description: Converts a string value to its corresponding State enum.
Parameters:
- value: std::string representing the State.
Returns:
- State enum value.
Throws:
- std::invalid_argument if the string does not match a valid State.
*/
inline State getState(const std::string& value) inline State getState(const std::string& value)
{ {
if (value == "ACTIVE") if (value == "ACTIVE")
@@ -1,49 +1,8 @@
/* /*
File: Utility.h File: Utility.h
Description: Header file declaring utility functions used across the system, Description:
including cost calculation for services and combo packages.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 20-May-2026
*/ */
#pragma once #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;
auto& requiredInventoryItems = service->getRequiredInventoryItems();
int requiredInventoryItemsSize = requiredInventoryItems.getSize();
for (int index = 0; index < requiredInventoryItemsSize; index++)
{
cost += requiredInventoryItems.getValueAt(index)->getPrice();
}
return cost;
}
/*
Function: calculateComboServiceEstimatedCost
Description: Calculates the estimated total cost of a combo package by summing
the labor and parts costs of all services included in the package.
Parameter: const ComboPackage* comboPackage - pointer to the combo package object
Return type: double - estimated total cost of the combo package
*/
inline double calculateComboServiceEstimatedCost(const ComboPackage* comboPackage)
{
double cost = 0;
auto& services = comboPackage->getServices();
int servicesSize = services.getSize();
for (int index = 0; index < servicesSize; index++)
{
const Service* service = services.getValueAt(index);
cost += calculatePartsCost(service) + service->getLaborCost();
}
return cost;
}
@@ -1,7 +1,27 @@
/*
File: AdminMenu.cpp
Description: Implements the AdminMenu class which provides the administrators console interface
in the Vehicle Service Management System. Handles menu display, user input, and
admin-specific operations such as inventory management, technician management,
service creation, combo package management, job assignment, and notifications.
Author: Trenser
Date: 19-May-2026
*/
#include "AdminMenu.h" #include "AdminMenu.h"
#include "InputHelper.h" #include "InputHelper.h"
#include "OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h"
/*
Function: showMenu
Description: Displays the admin menu in a loop until the user chooses to logout.
Handles exceptions and ensures smooth user interaction.
Parameters:
- None
Returns:
- void
*/
void AdminMenu::showMenu() void AdminMenu::showMenu()
{ {
bool isMenuActive = true; bool isMenuActive = true;
@@ -84,6 +104,15 @@ void AdminMenu::removeComboPackage()
{ {
} }
/*
Function: viewNotifications
Description: Displays notifications for the admin and allows deletion of notifications.
Parameters:
- None
Returns:
- void
*/
void AdminMenu::viewNotifications() void AdminMenu::viewNotifications()
{ {
viewAndDeleteNotification(m_controller);
} }
@@ -1,3 +1,12 @@
/*
File: AdminMenu.h
Description: Declares the AdminMenu class which provides the administrative console menu in the Vehicle Service Management System.
Supports operations such as inventory management, job assignment, service creation/removal, technician management,
combo package handling, notification viewing, and account management functions like logout and password change.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include "Controller.h" #include "Controller.h"
@@ -1,335 +1,74 @@
/* /*
File: CustomerMenu.cpp File: CustomerMenu.cpp
Description: Implementation file containing the method definitions of the Description: Implements the CustomerMenu class which provides the customers console interface
CustomerMenu class, including menu handling, service selection, in the Vehicle Service Management System. Handles menu display, user input, and
combo package booking, profile updates, and password management. customer-specific operations such as booking services, viewing history, managing payments,
invoices, and notifications.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#include <iomanip>
#include "CustomerMenu.h" #include "CustomerMenu.h"
#include "Service.h"
#include "InventoryItem.h"
#include "ComboPackage.h"
#include "Service.h"
#include "InputHelper.h" #include "InputHelper.h"
#include "OutputHelper.h" #include "OutputHelper.h"
#include "Validator.h" #include "MenuHelper.h"
#include "Vector.h"
#include "Utility.h"
#include "Map.h"
/* /*
Function: showMenu Function: showMenu
Description: Displays the customer menu and handles user input until logout is selected. Description: Displays the customer menu in a loop until the user chooses to logout.
Parameter: None Handles exceptions and ensures smooth user interaction.
Return type: void Parameters:
- None
Returns:
- void
*/ */
void CustomerMenu::showMenu() void CustomerMenu::showMenu()
{ {
while (true) bool isMenuActive = true;
{ while (isMenuActive)
try {
{ try
int choice; {
util::clear(); int choice;
std::cout << "Customer Menu" util::clear();
<< "\n1. Select a service" std::cout << "" << std::endl;
<< "\n2. Select a combo package" util::read(choice);
<< "\n3. Update Profile" if (!handleOperation(choice))
<< "\n4. Change Password" {
<< "\n5. View Service History" isMenuActive = false;
<< "\n6. Complete Payments" }
<< "\n7. View Invoices" }
<< "\n8. View Notifications" catch (const std::exception& e)
<< "\n9. Configure Notifications" {
<< "\n10. Logout" std::cout << "Exception: " << e.what() << std::endl;
<< "\nEnter a choice: "; util::pressEnter();
util::read(choice); }
if (!handleOperation(choice)) }
{
break;
}
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
}
} }
/*
Function: handleOperation
Description: Executes the corresponding customer operation based on the selected menu choice.
Parameter: int choice - selected menu option
Return type: bool - true if menu continues, false if logout
*/
bool CustomerMenu::handleOperation(int choice) bool CustomerMenu::handleOperation(int choice)
{ {
switch (choice) return false;
{
case 1:
selectService();
break;
case 2:
selectComboPackage();
break;
case 3:
updateDetails();
break;
case 4:
changePassword();
break;
case 5:
viewServiceHistory();
break;
case 6:
completePayments();
break;
case 7:
viewInvoices();
break;
case 8:
viewNotifications();
break;
case 9:
configureNotifications();
break;
case 10:
logout();
return false;
default:
std::cout << "Enter a valid choice!" << std::endl;
util::pressEnter();
}
return true;
} }
/*
Function: logout
Description: Logs out the currently authenticated customer user.
Parameter: None
Return type: void
*/
void CustomerMenu::logout() void CustomerMenu::logout()
{ {
m_controller.logout();
} }
/*
Function: changePassword
Description: Allows the customer to change their password after validation.
Parameter: None
Return type: void
*/
void CustomerMenu::changePassword() void CustomerMenu::changePassword()
{ {
std::string newPassword;
util::clear();
std::cout << "Enter new password: ";
util::read(newPassword);
m_controller.changePassword(newPassword);
if (!util::isPasswordValid(newPassword))
{
std::cout << "Error: Password is not strong enough!";
util::pressEnter();
return;
}
std::cout << "Password changed successfully";
util::pressEnter();
} }
/*
Function: updateDetails
Description: Allows the customer to update their email and phone number after validation.
Parameter: None
Return type: void
*/
void CustomerMenu::updateDetails() void CustomerMenu::updateDetails()
{ {
std::string email, phone;
util::clear();
std::cout << "Enter new email: ";
util::read(email);
if (!util::isEmailValid(email))
{
std::cout << "Error: Email is invalid!";
util::pressEnter();
return;
}
std::cout << "Enter new phone: ";
util::read(phone);
if (!util::isPhoneNumberValid(phone))
{
std::cout << "Error: Phone number is invalid!";
util::pressEnter();
return;
}
m_controller.updateUserDetails(email, phone);
std::cout << "Profile details updated successfully";
util::pressEnter();
} }
/*
Function: selectServiceFromServices
Description: Displays active services and allows the customer to select one by index.
Parameter: const util::Map<std::string, const Service*>& services - list of services
Return type: const Service* - selected service
*/
static const Service* selectServiceFromServices(const util::Map<std::string, const Service*>& services)
{
util::Map<int, const Service*> activeServicesMap;
int currentIndex = 1;
int userInputIndex;
std::cout << std::left
<< std::setw(10) << "Index"
<< std::setw(15) << "Service ID"
<< std::setw(25) << "Service Name"
<< std::setw(15) << "Estimated Cost"
<< std::endl;
for (int index = 0; index < services.getSize(); index++)
{
const Service* currentService = services.getValueAt(index);
if (currentService->getState() != util::State::ACTIVE)
{
continue;
}
activeServicesMap.insert(currentIndex, currentService);
double partsCost = calculatePartsCost(currentService);
std::cout << std::left
<< std::setw(10) << currentIndex
<< std::setw(15) << currentService->getId()
<< std::setw(25) << currentService->getName()
<< std::setw(15) << (currentService->getLaborCost() + partsCost)
<< std::endl;
currentIndex++;
}
if (activeServicesMap.getSize() == 0)
{
std::cout << "No active services available." << std::endl;
return nullptr;
}
std::cout << "Enter service index: ";
util::read(userInputIndex);
if (activeServicesMap.find(userInputIndex) == -1)
{
std::cout << "Invalid service index." << std::endl;
return nullptr;
}
return activeServicesMap[userInputIndex];
}
/*
Function: selectService
Description: Allows the customer to select a service, provide vehicle details,
and book the service through the controller.
Parameter: None
Return type: void
*/
void CustomerMenu::selectService() void CustomerMenu::selectService()
{ {
std::string vehicleNumber, vehicleBrand, vehicleModel;
auto services = m_controller.getServices();
util::Vector<std::string> selectedServices;
util::clear();
const Service* selectedService = selectServiceFromServices(services);
if (selectedService == nullptr)
{
std::cout << "Failed to book service!";
util::pressEnter();
return;
}
selectedServices.push_back(selectedService->getId());
util::clear();
std::cout << "Enter vehicle number: ";
util::read(vehicleNumber);
std::cout << "Enter vehicle brand: ";
util::read(vehicleBrand);
std::cout << "Enter vehicle model: ";
util::read(vehicleModel);
m_controller.purchaseService(selectedServices, vehicleNumber, vehicleBrand, vehicleModel);
std::cout << "Service has been booked successfully";
util::pressEnter();
} }
/*
Function: selectComboPackageFromPackages
Description: Displays active combo packages and allows the customer to select one by index.
Parameter: const util::Map<std::string, const ComboPackage*>& comboPackages - list of combo packages
Return type: const ComboPackage* - selected combo package
*/
static const ComboPackage* selectComboPackageFromPackages(const util::Map<std::string, const ComboPackage*>& comboPackages)
{
util::Map<int, const ComboPackage*> activeComboPackages;
int currentIndex = 1;
int userInputIndex;
std::cout << std::left
<< std::setw(10) << "Index"
<< std::setw(15) << "Combo Package ID"
<< std::setw(15) << "Combo Package Name"
<< std::setw(15) << "Estimate Cost"
<< std::endl;
for (int index = 0; index < comboPackages.getSize(); index++)
{
const ComboPackage* currentComboPackage = comboPackages.getValueAt(index);
if (currentComboPackage->getState() != util::State::ACTIVE)
{
continue;
}
activeComboPackages.insert(currentIndex, currentComboPackage);
std::cout << std::left
<< std::setw(10) << currentIndex
<< std::setw(15) << currentComboPackage->getId()
<< std::setw(25) << currentComboPackage->getPackageName()
<< std::setw(15) << calculateComboServiceEstimatedCost(currentComboPackage)
<< std::endl;
currentIndex++;
}
if (activeComboPackages.getSize() == 0)
{
std::cout << "No active combo packages available." << std::endl;
return nullptr;
}
std::cout << "Enter combo package index: ";
util::read(userInputIndex);
if (activeComboPackages.find(userInputIndex) == -1)
{
std::cout << "Invalid combo package index." << std::endl;
return nullptr;
}
return activeComboPackages[userInputIndex];
}
/*
Function: selectComboPackage
Description: Allows the customer to select a combo package, provide vehicle details,
and book the package through the controller.
Parameter: None
Return type: void
*/
void CustomerMenu::selectComboPackage() void CustomerMenu::selectComboPackage()
{ {
std::string vehicleNumber, vehicleBrand, vehicleModel;
auto comboPackages = m_controller.getComboPackages();
util::clear();
const ComboPackage* selectedComboPackage = selectComboPackageFromPackages(comboPackages);
if (selectedComboPackage == nullptr)
{
std::cout << "Failed to book combo package!";
util::pressEnter();
return;
}
util::clear();
std::cout << "Enter vehicle number: ";
util::read(vehicleNumber);
std::cout << "Enter vehicle brand: ";
util::read(vehicleBrand);
std::cout << "Enter vehicle model: ";
util::read(vehicleModel);
m_controller.purchaseComboPackage(selectedComboPackage->getId(), vehicleNumber, vehicleBrand, vehicleModel);
std::cout << "Combo Package has been booked successfully";
util::pressEnter();
} }
void CustomerMenu::viewServiceHistory() void CustomerMenu::viewServiceHistory()
@@ -344,10 +83,66 @@ void CustomerMenu::viewInvoices()
{ {
} }
/*
Function: viewNotifications
Description: Displays notifications for the customer and allows deletion of notifications.
Parameters:
- None
Returns:
- void
*/
void CustomerMenu::viewNotifications() void CustomerMenu::viewNotifications()
{ {
viewAndDeleteNotification(m_controller);
} }
/*
Function: getNotificationPreference (static helper)
Description: Helper function to configure notification preferences for a specific service.
Parameters:
- serviceName: Name of the service for which notifications are being configured.
Returns:
- bool: True if notifications are enabled, False if disabled.
*/
static bool getNotificationPreference(const std::string& serviceName)
{
int choice;
while (true)
{
util::clear();
std::cout << " Configure Notification Preferences\n";
std::cout << "\n" << serviceName << " Notifications\n";
std::cout << "1. Enable Notifications\n";
std::cout << "2. Disable Notifications\n";
std::cout << "Enter your choice: ";
util::read(choice);
if (choice == 1)
{
return true;
}
if (choice == 2)
{
return false;
}
std::cout << "\nInvalid choice. Please enter 1 or 2.\n";
util::pressEnter();
}
}
/*
Function: configureNotifications
Description: Allows the customer to configure notification preferences for payment and service management.
Parameters:
- None
Returns:
- void
*/
void CustomerMenu::configureNotifications() void CustomerMenu::configureNotifications()
{ {
} bool paymentServiceNotifications = getNotificationPreference("Payment Management Service");
bool serviceManagementNotifications = getNotificationPreference("Service Management Service");
m_controller.configureNotifications(paymentServiceNotifications, serviceManagementNotifications);
util::clear();
std::cout << "Notification preferences updated successfully.\n";
util::pressEnter();
}
@@ -1,12 +1,12 @@
/* /*
File: CustomerMenu.h File: CustomerMenu.h
Description: Header file declaring the CustomerMenu class, which provides Description: Declares the CustomerMenu class which provides the customer-facing console menu in the Vehicle Service Management System.
customer operations such as selecting services, booking combo Supports operations such as account management, service selection, combo package booking, viewing service history,
packages, updating profile details, managing payments, viewing handling payments and invoices, and managing notifications.
invoices, and configuring notifications.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include "Controller.h" #include "Controller.h"
@@ -1,26 +1,29 @@
/* /*
File: MenuHelper.h File: MenuHelper.h
Description: Header file declaring the MenuHelper class, which provides Description: Provides inline utility functions to support menu operations in the Vehicle Service Management System.
utility functions for menu-driven operations such as Includes helper functions for selecting, displaying, and managing notifications, as well as
notification selection and display. integrating with the controller for user interactions.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 21-May-2026
*/ */
#pragma once #pragma once
#include <string>
#include <iomanip> #include <iomanip>
#include "Vector.h"
#include "Controller.h"
#include "Notification.h" #include "Notification.h"
#include "Map.h"
#include "InputHelper.h" #include "InputHelper.h"
#include "OutputHelper.h" #include "OutputHelper.h"
/* /*
Function: selectNotification Function: selectNotification
Description: Displays a list of notifications with index, ID, title, and timestamp. Description: Displays a list of notifications with index, ID, title, and timestamp,
Allows the user to select a notification by index. Returns the selected then allows the user to select one by index.
notification or nullptr if the selection is invalid. Parameters:
Parameter: const util::Vector<const Notification*>& notifications - list of notifications - notifications: Vector of Notification pointers to be displayed.
Return type: const Notification* - pointer to the selected notification Returns:
- const Notification* representing the selected notification.
- nullptr if no notifications are available or if the selection is invalid.
*/ */
inline const Notification* selectNotification(const util::Vector<const Notification*>& notifications) inline const Notification* selectNotification(const util::Vector<const Notification*>& notifications)
{ {
@@ -29,6 +32,7 @@ inline const Notification* selectNotification(const util::Vector<const Notificat
std::cout << "No notifications available." << std::endl; std::cout << "No notifications available." << std::endl;
return nullptr; return nullptr;
} }
util::Map<int, const Notification*> indexedNotifications;
std::cout << std::left std::cout << std::left
<< std::setw(6) << "Index" << std::setw(6) << "Index"
<< std::setw(15) << "ID" << std::setw(15) << "ID"
@@ -36,9 +40,9 @@ inline const Notification* selectNotification(const util::Vector<const Notificat
<< std::setw(25) << "Timestamp" << std::setw(25) << "Timestamp"
<< std::endl; << std::endl;
int currentIndex = 1; int currentIndex = 1;
for (int iterator = 0; iterator < notifications.getSize(); iterator++) for (int index = 0; index < notifications.getSize(); index++)
{ {
const Notification* currentNotification = notifications[iterator]; const Notification* currentNotification = notifications[index];
if (currentNotification) if (currentNotification)
{ {
std::cout << std::left std::cout << std::left
@@ -47,16 +51,64 @@ inline const Notification* selectNotification(const util::Vector<const Notificat
<< std::setw(30) << currentNotification->getTitle() << std::setw(30) << currentNotification->getTitle()
<< std::setw(25) << currentNotification->getCreatedAt().toString() << std::setw(25) << currentNotification->getCreatedAt().toString()
<< std::endl; << std::endl;
indexedNotifications.insert(currentIndex, currentNotification);
currentIndex++; currentIndex++;
} }
} }
int selectedIndex; int selectedIndex;
std::cout << "Select notification: "; std::cout << "Select notification: ";
util::read(selectedIndex); util::read(selectedIndex);
if (selectedIndex < 1 || selectedIndex > notifications.getSize()) if (!indexedNotifications.containsKey(selectedIndex))
{ {
std::cout << "Invalid selection." << std::endl; std::cout << "Invalid selection." << std::endl;
return nullptr; return nullptr;
} }
return notifications[selectedIndex - 1]; return indexedNotifications[selectedIndex];
}
/*
Function: displayNotification
Description: Displays detailed information about a single notification, including ID, title, timestamp, and message.
Parameters:
- notification: Pointer to the Notification object to be displayed.
Returns:
- void
*/
inline void displayNotification(const Notification* notification)
{
util::clear();
if (!notification)
{
std::cout << "Notification not found." << std::endl;
return;
}
std::cout << "Notification Details" << std::endl;
std::cout << "ID : " << notification->getId() << std::endl;
std::cout << "Title : " << notification->getTitle() << std::endl;
std::cout << "Timestamp : " << notification->getCreatedAt().toString() << std::endl;
std::cout << "Message : " << notification->getMessage() << std::endl;
}
/*
Function: viewAndDeleteNotification
Description: Allows the user to view a notification and then delete it from the system using the controller.
Parameters:
- controller: Reference to the Controller object used to manage notifications.
Returns:
- void
*/
inline void viewAndDeleteNotification(Controller& controller)
{
util::clear();
auto notifications = controller.getNotifications();
const Notification* selectedNotification = selectNotification(notifications);
if (!selectedNotification)
{
std::cout << "Failed to display notification!";
util::pressEnter();
return;
}
displayNotification(selectedNotification);
controller.deleteNotification(selectedNotification->getId());
util::pressEnter();
} }
@@ -1,7 +1,26 @@
/*
File: TechnicianMenu.cpp
Description: Implements the TechnicianMenu class which provides the technicians console interface
in the Vehicle Service Management System. Handles menu display, user input, and
technician-specific operations such as completing jobs and viewing notifications.
Author: Trenser
Date: 19-May-2026
*/
#include "TechnicianMenu.h" #include "TechnicianMenu.h"
#include "InputHelper.h" #include "InputHelper.h"
#include "OutputHelper.h" #include "OutputHelper.h"
#include "MenuHelper.h"
/*
Function: showMenu
Description: Displays the technician menu in a loop until the user chooses to logout.
Handles exceptions and ensures smooth user interaction.
Parameters:
- None
Returns:
- void
*/
void TechnicianMenu::showMenu() void TechnicianMenu::showMenu()
{ {
bool isMenuActive = true; bool isMenuActive = true;
@@ -35,6 +54,15 @@ void TechnicianMenu::completeJob()
{ {
} }
/*
Function: viewNotifications
Description: Displays notifications for the technician and allows deletion of notifications.
Parameters:
- None
Returns:
- void
*/
void TechnicianMenu::viewNotifications() void TechnicianMenu::viewNotifications()
{ {
viewAndDeleteNotification(m_controller);
} }
@@ -1,3 +1,11 @@
/*
File: TechnicianMenu.h
Description: Declares the TechnicianMenu class which provides the technician-facing console menu in the Vehicle Service Management System.
Supports operations such as viewing assigned jobs, completing jobs, and managing notifications.
Author: Trenser
Date: 19-May-2026
*/
#pragma once #pragma once
#include "Controller.h" #include "Controller.h"
@@ -1,27 +1,27 @@
/* /*
File: UserInterface.cpp File: UserInterface.cpp
Description: Implementation file containing the method definitions of the Description: Implements the UserInterface class which provides the main entry point for the Vehicle Service Management System.
UserInterface class, including system run loop, login handling, Handles system checks, displays the main menu, and manages user operations such as login and customer registration.
and customer registration logic.
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#include "UserInterface.h" #include "UserInterface.h"
#include "InputHelper.h" #include "InputHelper.h"
#include "OutputHelper.h" #include "OutputHelper.h"
#include "Enums.h"
#include "User.h"
#include "Validator.h"
/* /*
Function: run Function: run
Description: Runs the main system loop, displaying the initial menu for login, Description: Runs the Vehicle Service Management System interface.
customer registration, or exit. Handles exceptions gracefully. Performs system checks, displays the main menu, and processes user input until exit.
Parameter: None Parameters:
Return type: void - None
Returns:
- void
*/ */
void UserInterface::run() void UserInterface::run()
{ {
m_controller.runSystemChecks();
bool isMenuActive = true; bool isMenuActive = true;
while (isMenuActive) while (isMenuActive)
{ {
@@ -46,9 +46,11 @@ void UserInterface::run()
/* /*
Function: handleOperation Function: handleOperation
Description: Executes the corresponding system operation based on the selected menu choice. Description: Processes the users menu choice and executes the corresponding action.
Parameter: int choice - selected menu option Parameters:
Return type: bool - true if menu continues, false if exit - choice: Integer representing the selected menu option.
Returns:
- bool: True if the menu should remain active, False if exit is selected.
*/ */
bool UserInterface::handleOperation(int choice) bool UserInterface::handleOperation(int choice)
{ {
@@ -72,88 +74,26 @@ bool UserInterface::handleOperation(int choice)
/* /*
Function: login Function: login
Description: Handles user login by validating credentials. Based on the authenticated Description: Handles the login process for existing users.
user type, navigates to the appropriate menu (Admin, Technician, Customer). Parameters:
Parameter: None - None
Return type: void Returns:
- void
*/ */
void UserInterface::login() 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";
}
} }
/* /*
Function: registerCustomer Function: registerCustomer
Description: Registers a new customer by collecting and validating details such as Description: Handles the registration process for new customers.
username, name, email, password, and phone number. Delegates creation Parameters:
to the controller. - None
Parameter: None Returns:
Return type: void - void
*/ */
void UserInterface::registerCustomer() void UserInterface::registerCustomer()
{ {
std::string username, name, email, phone, password;
util::clear();
std::cout << "Enter username: ";
util::read(username);
std::cout << "Enter name: ";
util::read(name);
std::cout << "Enter email: ";
util::read(email);
if (!util::isEmailValid(email))
{
std::cout << "Error: Email is invalid!";
util::pressEnter();
return;
}
std::cout << "Enter password: ";
util::read(password);
if (!util::isPasswordValid(password))
{
std::cout << "Error: Password is invalid!";
util::pressEnter();
return;
}
std::cout << "Enter phone: ";
util::read(phone);
if (!util::isPhoneNumberValid(phone))
{
std::cout << "Error: Phone number is invalid!";
util::pressEnter();
return;
}
m_controller.createCustomer(username, name, password, email, phone);
std::cout << "Registration is successful";
util::pressEnter();
} }
@@ -1,12 +1,12 @@
/* /*
File: UserInterface.h File: UserInterface.h
Description: Header file declaring the UserInterface class, which provides Description: Declares the UserInterface class which provides the main console interface for the Vehicle Service Management System.
the main entry point for the Vehicle Service System. Handles Handles user interactions such as login, customer registration, and role-based menu navigation
login, customer registration, and menu navigation for different for Admin, Technician, and Customer modules.
user roles (Admin, Technician, Customer).
Author: Trenser Author: Trenser
Date:19-May-2026 Date: 19-May-2026
*/ */
#pragma once #pragma once
#include "Controller.h" #include "Controller.h"
#include "AdminMenu.h" #include "AdminMenu.h"