diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.cpp index eff3229..3db950c 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.cpp @@ -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" +/* +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() { UserInterface userInterface; userInterface.run(); -} +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj index 0cb9d3f..063f776 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj @@ -182,6 +182,7 @@ + diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters index 7c17f4e..69f87db 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters @@ -233,8 +233,14 @@ Header Files\Models + + Header Files\Views + Header Files\Utilities + + Header Files\Utilities + \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index da2c182..5bbd32e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -6,9 +6,8 @@ Description: Implementation file containing the method definitions Author: Trenser Date:19-May-2026 */ -#include -#include "ComboPackage.h" #include "Controller.h" +#include "ComboPackage.h" #include "Enums.h" #include "InventoryItem.h" #include "Invoice.h" @@ -16,6 +15,8 @@ Date:19-May-2026 #include "Service.h" #include "ServiceBooking.h" #include "User.h" +#include "User.h" +#include /* Function: login @@ -73,9 +74,9 @@ Parameter: const std::string& username - technician's username const std::string& phoneNumber - technician's phone number Return type: void */ -void Controller::createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phoneNumber) +void Controller::createTechnician(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phoneNumber) { - m_userManagementService.createUser(username, password, email, phoneNumber, util::UserType::TECHNICIAN); + m_userManagementService.createUser(username, name, password, email, phoneNumber, util::UserType::TECHNICIAN); } void Controller::updateUserDetails(const std::string& email, const std::string& phone) @@ -344,21 +345,95 @@ void Controller::completePayment(const std::string& invoiceID, util::PaymentMode m_paymentManagementService.completePayment(invoiceID, 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 +*/ util::Vector Controller::getNotifications() { - return util::Vector(); + 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 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) { + 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 +Description: Executes system checks including sending low stock alerts + and payment reminders. +Parameters: None +Return type: void +*/ void Controller::runSystemChecks() { m_userManagementService.ensureAdminExists(); + m_inventoryManagementService.sendLowStockAlerts(); + m_paymentManagementService.sendPaymentReminders(); } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index f7694fc..a0aa280 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -39,7 +39,7 @@ public: 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); const User* getAuthenticatedUser(); - void createTechnician(const std::string& username, const std::string& password, const std::string& email, const std::string& phoneNumber); + void createTechnician(const std::string& username, const std::string& name, const std::string& password, const std::string& email, const std::string& phoneNumber); void updateUserDetails(const std::string& email, const std::string& phone); util::Map getServices(); util::Map getComboPackages(); @@ -48,6 +48,7 @@ public: util::Map getInventoryItems(); const InventoryItem* getInventoryItem(const std::string& inventoryItemID); void addInventoryItem(const std::string& partName, int quantity, double price); + void addInventoryItemStock(const std::string& selectedItemId, int quantity); void removeInventoryItem(const std::string& inventoryItemID); util::Map getServiceBookings(); util::Map getServiceBookingsByUser(const std::string userID); @@ -65,7 +66,6 @@ public: void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode); util::Vector getNotifications(); void deleteNotification(const std::string& notificationID); - void configureNotifications(const std::string& userID, bool paymentNotifications, bool serviceNotifications); - void addInventoryItemStock(const std::string& selectedItemId, int quantity); + void configureNotifications(bool paymentNotifications, bool serviceNotifications); void runSystemChecks(); }; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h index 98f0efa..7fd7262 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h @@ -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 class Notification; @@ -6,5 +13,5 @@ class Observer { public: virtual ~Observer() = default; - virtual void update(Notification* notification) = 0; + virtual void addNotification(Notification* notification) = 0; }; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Subject.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Subject.h index 309a59d..4cfe5ce 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Subject.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Subject.h @@ -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 #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp index dd0e016..3419f44 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp @@ -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" +/* +Function: getInstance +Description: Provides a singleton instance of the DataStore class. +Parameters: + - None +Returns: + - Reference to the single DataStore instance. +*/ DataStore& DataStore::getInstance() { static DataStore dataStore; return dataStore; } +/* +Function: getUsers +Description: Retrieves the internal map of users. +Parameters: + - None +Returns: + - Reference to util::Map containing all users. +*/ util::Map& DataStore::getUsers() { return m_users; } +/* +Function: getServices +Description: Retrieves the internal map of services. +Parameters: + - None +Returns: + - Reference to util::Map containing all services. +*/ util::Map& DataStore::getServices() { return m_services; } +/* +Function: getComboPackages +Description: Retrieves the internal map of combo packages. +Parameters: + - None +Returns: + - Reference to util::Map containing all combo packages. +*/ util::Map& DataStore::getComboPackages() { return m_comboPackages; } +/* +Function: getServiceBookings +Description: Retrieves the internal map of service bookings. +Parameters: + - None +Returns: + - Reference to util::Map containing all service bookings. +*/ util::Map& DataStore::getServiceBookings() { return m_serviceBookings; } +/* +Function: getJobCards +Description: Retrieves the internal map of job cards. +Parameters: + - None +Returns: + - Reference to util::Map containing all job cards. +*/ util::Map& DataStore::getJobCards() { return m_jobCards; } +/* +Function: getInventoryItems +Description: Retrieves the internal map of inventory items. +Parameters: + - None +Returns: + - Reference to util::Map containing all inventory items. +*/ util::Map& DataStore::getInventoryItems() { return m_inventoryItems; } +/* +Function: getInvoices +Description: Retrieves the internal map of invoices. +Parameters: + - None +Returns: + - Reference to util::Map containing all invoices. +*/ util::Map& DataStore::getInvoices() { return m_invoices; } +/* +Function: getPayments +Description: Retrieves the internal map of payments. +Parameters: + - None +Returns: + - Reference to util::Map containing all payments. +*/ util::Map& DataStore::getPayments() { return m_payments; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h index 924e8e4..cde9b4e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h @@ -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 #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp index 6216922..41e75d0 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp @@ -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" 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() : m_id("CMP" + std::to_string(++m_uid)), m_status(util::State::ACTIVE), 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& services) : m_id("CMP" + std::to_string(++m_uid)), m_packageName(packageName), @@ -14,51 +43,131 @@ ComboPackage::ComboPackage(const std::string& packageName, double discountPercen m_status(util::State::ACTIVE), 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 { 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 { 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 { 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 { return m_status; } +/* +Function: getServices +Description: Retrieves the map of services included in the combo package. +Parameters: + - None +Returns: + - const util::Map& representing the services. +*/ const util::Map& ComboPackage::getServices() const { 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) { 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) { 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) { 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& 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) { m_status = status; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h index 4b28d54..a620ee4 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h @@ -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 #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp index c3dbbaa..edc8654 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp @@ -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" 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() : m_id("IIM" + std::to_string(++m_uid)), m_quantity(0), m_status(util::State::ACTIVE), 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) : m_id("IIM" + std::to_string(++m_uid)), m_partName(partName), @@ -15,51 +43,131 @@ InventoryItem::InventoryItem(const std::string& partName, int quantity, double p m_status(util::State::ACTIVE), 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 { 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 { 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 { return m_quantity; } +/* +Function: getPrice +Description: Retrieves the price of the inventory item. +Parameters: + - None +Returns: + - double representing the price. +*/ double InventoryItem::getPrice() const { 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 { 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) { 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) { 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) { 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) { 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) { m_status = status; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h index d9618bc..0cb36ac 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h @@ -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 #include #include "Enums.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp index 507f274..f15acda 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp @@ -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" 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() : m_id("INV" + std::to_string(++m_uid)), m_booking(nullptr), @@ -12,6 +31,24 @@ Invoice::Invoice() m_paymentMethod(util::PaymentMode()), 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( const std::string& bookingId, ServiceBooking* booking, @@ -39,122 +76,290 @@ Invoice::Invoice( m_paymentMethod(paymentMethod), 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 { 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 { return m_bookingId; } +/* +Function: getBooking +Description: Retrieves the pointer to the associated ServiceBooking. +Returns: + - ServiceBooking* representing the booking. +*/ ServiceBooking* Invoice::getBooking() const { 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 { return m_invoiceDate; } +/* +Function: getLaborCost +Description: Retrieves the labor cost associated with the invoice. +Returns: + - double representing the labor cost. +*/ double Invoice::getLaborCost() const { return m_laborCost; } +/* +Function: getParts +Description: Retrieves the map of inventory items used in the service. +Returns: + - const util::Map& representing the parts. +*/ const util::Map& Invoice::getParts() const { 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 { return m_partsCost; } +/* +Function: getDiscountPercentage +Description: Retrieves the discount percentage applied to the invoice. +Returns: + - double representing the discount percentage. +*/ double Invoice::getDiscountPercentage() const { 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 { 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 { 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 { 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 { 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) { 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) { 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) { 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) { 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) { 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& 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) { 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) { 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) { 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) { 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) { 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) { m_status = status; -} +} \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h index f78f7c9..5a540b0 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h @@ -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 #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp index 7e441f2..b626891 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp @@ -12,10 +12,12 @@ int JobCard::m_uid = 0; /* Function: JobCard -Description: Default constructor that initializes a new job card with - a unique ID and default values. -Parameter: None -Return type: Constructor +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() : m_id("JC" + std::to_string(++m_uid)), @@ -62,9 +64,9 @@ JobCard::JobCard(const std::string& bookingId, /* Function: getId -Description: Retrieves the unique identifier of the job card. -Parameter: None -Return type: const std::string& +Description: Retrieves the unique ID of the job card. +Returns: + - const std::string& representing the job card ID. */ const std::string& JobCard::getId() const { @@ -74,8 +76,8 @@ const std::string& JobCard::getId() const /* Function: getBookingId Description: Retrieves the booking ID associated with the job card. -Parameter: None -Return type: const std::string& +Returns: + - const std::string& representing the booking ID. */ const std::string& JobCard::getBookingId() const { @@ -84,9 +86,9 @@ const std::string& JobCard::getBookingId() const /* Function: getBooking -Description: Retrieves the booking object associated with the job card. -Parameter: None -Return type: ServiceBooking* +Description: Retrieves the pointer to the associated ServiceBooking. +Returns: + - ServiceBooking* representing the booking. */ ServiceBooking* JobCard::getBooking() const { @@ -95,9 +97,9 @@ ServiceBooking* JobCard::getBooking() const /* Function: getService -Description: Retrieves the service object associated with the job card. -Parameter: None -Return type: Service* +Description: Retrieves the pointer to the associated Service. +Returns: + - Service* representing the service. */ Service* JobCard::getService() const { @@ -107,8 +109,8 @@ Service* JobCard::getService() const /* Function: getServiceId Description: Retrieves the service ID associated with the job card. -Parameter: None -Return type: const std::string& +Returns: + - const std::string& representing the service ID. */ const std::string& JobCard::getServiceId() const { @@ -117,9 +119,9 @@ const std::string& JobCard::getServiceId() const /* Function: getTechnicianId -Description: Retrieves the technician ID assigned to the job card. -Parameter: None -Return type: const std::string& +Description: Retrieves the technician ID associated with the job card. +Returns: + - const std::string& representing the technician ID. */ const std::string& JobCard::getTechnicianId() const { @@ -128,9 +130,9 @@ const std::string& JobCard::getTechnicianId() const /* Function: getTechnician -Description: Retrieves the technician object assigned to the job card. -Parameter: None -Return type: User* +Description: Retrieves the pointer to the assigned technician. +Returns: + - User* representing the technician. */ User* JobCard::getTechnician() const { @@ -139,9 +141,9 @@ User* JobCard::getTechnician() const /* Function: getAssignedDate -Description: Retrieves the date when the job was assigned. -Parameter: None -Return type: const util::Timestamp& +Description: Retrieves the timestamp of when the job was assigned. +Returns: + - const util::Timestamp& representing the assigned date. */ const util::Timestamp& JobCard::getAssignedDate() const { @@ -161,9 +163,9 @@ util::ServiceJobStatus JobCard::getStatus() const /* Function: getCompletionDate -Description: Retrieves the completion date of the job card. -Parameter: None -Return type: const util::Timestamp& +Description: Retrieves the timestamp of when the job was completed. +Returns: + - const util::Timestamp& representing the completion date. */ const util::Timestamp& JobCard::getCompletionDate() const { @@ -172,9 +174,11 @@ const util::Timestamp& JobCard::getCompletionDate() const /* Function: setId -Description: Sets the unique identifier of the job card. -Parameter: const std::string& id - new job card ID -Return type: void +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) { @@ -183,9 +187,11 @@ void JobCard::setId(const std::string& id) /* Function: setBookingId -Description: Sets the booking ID for the job card. -Parameter: const std::string& bookingId - new booking ID -Return type: void +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) { @@ -194,9 +200,11 @@ void JobCard::setBookingId(const std::string& bookingId) /* Function: setBooking -Description: Sets the booking object for the job card. -Parameter: ServiceBooking* booking - pointer to the booking object -Return type: void +Description: Sets the associated ServiceBooking pointer. +Parameters: + - booking: Pointer to the ServiceBooking object. +Returns: + - void */ void JobCard::setBooking(ServiceBooking* booking) { @@ -205,9 +213,11 @@ void JobCard::setBooking(ServiceBooking* booking) /* Function: setService -Description: Sets the service object for the job card. -Parameter: Service* service - pointer to the service object -Return type: void +Description: Sets the associated Service pointer. +Parameters: + - service: Pointer to the Service object. +Returns: + - void */ void JobCard::setService(Service* service) { @@ -216,9 +226,11 @@ void JobCard::setService(Service* service) /* Function: setServiceId -Description: Sets the service ID for the job card. -Parameter: const std::string& serviceId - new service ID -Return type: void +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) { @@ -227,9 +239,11 @@ void JobCard::setServiceId(const std::string& serviceId) /* Function: setTechnicianId -Description: Sets the technician ID for the job card. -Parameter: const std::string& technicianId - new technician ID -Return type: void +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) { @@ -238,9 +252,11 @@ void JobCard::setTechnicianId(const std::string& technicianId) /* Function: setTechnician -Description: Sets the technician object for the job card. -Parameter: User* technician - pointer to the technician object -Return type: void +Description: Sets the pointer to the assigned technician. +Parameters: + - technician: Pointer to the User object. +Returns: + - void */ void JobCard::setTechnician(User* technician) { @@ -249,9 +265,11 @@ void JobCard::setTechnician(User* technician) /* Function: setAssignedDate -Description: Sets the assigned date for the job card. -Parameter: const util::Timestamp& assignedDate - new assigned date -Return type: void +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) { @@ -271,9 +289,11 @@ void JobCard::setStatus(util::ServiceJobStatus status) /* Function: setCompletionDate -Description: Sets the completion date for the job card. -Parameter: const util::Timestamp& completionDate - new completion date -Return type: void +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) { diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp index dc3ed1d..353bcb2 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp @@ -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" 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() : m_id("NOT" + std::to_string(++m_uid)), 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) : m_id("NOT" + std::to_string(++m_uid)), m_recipientUserId(recipientUserId), @@ -14,61 +42,145 @@ Notification::Notification(const std::string& recipientUserId, User* recipient, m_message(message), 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 { 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 { return m_recipientUserId; } +/* +Function: getRecipient +Description: Retrieves the pointer to the recipient user. +Returns: + - User* representing the recipient. +*/ User* Notification::getRecipient() const { 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 { 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 { 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 { 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) { 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) { 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) { 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) { 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) { 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) { m_createdAt = createdAt; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h index f86499e..0ba780b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h @@ -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 #include #include "Timestamp.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp index fa7f509..02fe9ea 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp @@ -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" 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() : m_id("SRV" + std::to_string(++m_uid)), m_status(util::State::ACTIVE), 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& requiredInventoryItems, double laborCost) : m_id("SRV" + std::to_string(++m_uid)), m_name(name), @@ -14,51 +42,121 @@ Service::Service(const std::string& name, const util::Map& representing the required inventory items. +*/ const util::Map& Service::getRequiredInventoryItems() const { return m_requiredInventoryItems; } +/* +Function: getLaborCost +Description: Retrieves the labor cost associated with the service. +Returns: + - double representing the labor cost. +*/ double Service::getLaborCost() const { 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 { 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) { 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) { 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& 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) { 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) { m_status = status; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h index b0d3175..7d15ebe 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h @@ -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 #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp index 462c370..41b7700 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp @@ -12,10 +12,12 @@ int ServiceBooking::m_uid = 0; /* Function: ServiceBooking -Description: Default constructor that initializes a new service booking - with a unique ID, no customer, and zero discount. -Parameter: None -Return type: Constructor +Description: Default constructor that initializes a new service booking with a unique ID, + null customer, and zero discount percentage. +Parameters: + - None +Returns: + - A new ServiceBooking object. */ ServiceBooking::ServiceBooking() : m_id("SRV" + std::to_string(++m_uid)), @@ -49,8 +51,6 @@ ServiceBooking::ServiceBooking( const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel, - const std::string& assignedTechnicianId, - User* assignedTechnician, double discountPercentage ) : m_id("SRV" + std::to_string(++m_uid)), @@ -69,9 +69,9 @@ ServiceBooking::ServiceBooking( /* Function: getId -Description: Retrieves the unique identifier of the service booking. -Parameter: None -Return type: const std::string& +Description: Retrieves the unique ID of the service booking. +Returns: + - const std::string& representing the booking ID. */ const std::string& ServiceBooking::getId() const { @@ -81,8 +81,8 @@ const std::string& ServiceBooking::getId() const /* Function: getStatus Description: Retrieves the current status of the service booking. -Parameter: None -Return type: util::ServiceJobStatus +Returns: + - util::ServiceJobStatus representing the booking status. */ util::ServiceJobStatus ServiceBooking::getStatus() const { @@ -91,9 +91,9 @@ util::ServiceJobStatus ServiceBooking::getStatus() const /* Function: getServices -Description: Retrieves the services associated with the booking. -Parameter: None -Return type: const util::Map& +Description: Retrieves the map of services included in the booking. +Returns: + - const util::Map& representing the services. */ const util::Map& ServiceBooking::getServices() const { @@ -103,8 +103,8 @@ const util::Map& ServiceBooking::getServices() const /* Function: getCustomerId Description: Retrieves the customer ID associated with the booking. -Parameter: None -Return type: const std::string& +Returns: + - const std::string& representing the customer ID. */ const std::string& ServiceBooking::getCustomerId() const { @@ -113,9 +113,9 @@ const std::string& ServiceBooking::getCustomerId() const /* Function: getCustomer -Description: Retrieves the customer object associated with the booking. -Parameter: None -Return type: User* +Description: Retrieves the pointer to the associated customer. +Returns: + - User* representing the customer. */ User* ServiceBooking::getCustomer() const { @@ -124,9 +124,9 @@ User* ServiceBooking::getCustomer() const /* Function: getVehicleNumber -Description: Retrieves the vehicle registration number for the booking. -Parameter: None -Return type: const std::string& +Description: Retrieves the vehicle registration number. +Returns: + - const std::string& representing the vehicle number. */ const std::string& ServiceBooking::getVehicleNumber() const { @@ -135,9 +135,9 @@ const std::string& ServiceBooking::getVehicleNumber() const /* Function: getVehicleBrand -Description: Retrieves the brand of the vehicle for the booking. -Parameter: None -Return type: const std::string& +Description: Retrieves the brand of the vehicle. +Returns: + - const std::string& representing the vehicle brand. */ const std::string& ServiceBooking::getVehicleBrand() const { @@ -146,9 +146,9 @@ const std::string& ServiceBooking::getVehicleBrand() const /* Function: getVehicleModel -Description: Retrieves the model of the vehicle for the booking. -Parameter: None -Return type: const std::string& +Description: Retrieves the model of the vehicle. +Returns: + - const std::string& representing the vehicle model. */ const std::string& ServiceBooking::getVehicleModel() const { @@ -157,9 +157,9 @@ const std::string& ServiceBooking::getVehicleModel() const /* Function: getAssignedTechnicianId -Description: Retrieves the ID of the technician assigned to the booking. -Parameter: None -Return type: const std::string& +Description: Retrieves the ID of the assigned technician. +Returns: + - const std::string& representing the technician ID. */ const std::string& ServiceBooking::getAssignedTechnicianId() const { @@ -180,8 +180,8 @@ User* ServiceBooking::getAssignedTechnician() const /* Function: getDiscountPercentage Description: Retrieves the discount percentage applied to the booking. -Parameter: None -Return type: double +Returns: + - double representing the discount percentage. */ double ServiceBooking::getDiscountPercentage() const { @@ -190,9 +190,11 @@ double ServiceBooking::getDiscountPercentage() const /* Function: setId -Description: Sets the unique identifier of the service booking. -Parameter: const std::string& id - new booking ID -Return type: void +Description: Sets the unique ID of the service booking. +Parameters: + - id: New booking ID string. +Returns: + - void */ void ServiceBooking::setId(const std::string& id) { @@ -202,8 +204,10 @@ void ServiceBooking::setId(const std::string& id) /* Function: setStatus Description: Sets the current status of the service booking. -Parameter: const util::ServiceJobStatus& status - new booking status -Return type: void +Parameters: + - status: New booking status value. +Returns: + - void */ void ServiceBooking::setStatus(const util::ServiceJobStatus& status) { @@ -212,9 +216,11 @@ void ServiceBooking::setStatus(const util::ServiceJobStatus& status) /* Function: setServices -Description: Sets the services associated with the booking. -Parameter: const util::Map& services - new services map -Return type: void +Description: Sets the services included in the booking. +Parameters: + - services: Map of services. +Returns: + - void */ void ServiceBooking::setServices(const util::Map& services) { @@ -223,9 +229,11 @@ void ServiceBooking::setServices(const util::Map& service /* Function: setCustomerId -Description: Sets the customer ID for the booking. -Parameter: const std::string& customerId - new customer ID -Return type: void +Description: Sets the customer ID associated with the booking. +Parameters: + - customerId: New customer ID string. +Returns: + - void */ void ServiceBooking::setCustomerId(const std::string& customerId) { @@ -234,9 +242,11 @@ void ServiceBooking::setCustomerId(const std::string& customerId) /* Function: setCustomer -Description: Sets the customer object for the booking. -Parameter: User* customer - pointer to the customer object -Return type: void +Description: Sets the pointer to the associated customer. +Parameters: + - customer: Pointer to the User object. +Returns: + - void */ void ServiceBooking::setCustomer(User* customer) { @@ -245,9 +255,11 @@ void ServiceBooking::setCustomer(User* customer) /* Function: setVehicleNumber -Description: Sets the vehicle registration number for the booking. -Parameter: const std::string& vehicleNumber - new vehicle number -Return type: void +Description: Sets the vehicle registration number. +Parameters: + - vehicleNumber: New vehicle number string. +Returns: + - void */ void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber) { @@ -256,9 +268,11 @@ void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber) /* Function: setVehicleBrand -Description: Sets the brand of the vehicle for the booking. -Parameter: const std::string& vehicleBrand - new vehicle brand -Return type: void +Description: Sets the brand of the vehicle. +Parameters: + - vehicleBrand: New vehicle brand string. +Returns: + - void */ void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand) { @@ -267,9 +281,11 @@ void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand) /* Function: setVehicleModel -Description: Sets the model of the vehicle for the booking. -Parameter: const std::string& vehicleModel - new vehicle model -Return type: void +Description: Sets the model of the vehicle. +Parameters: + - vehicleModel: New vehicle model string. +Returns: + - void */ void ServiceBooking::setVehicleModel(const std::string& vehicleModel) { @@ -278,9 +294,11 @@ void ServiceBooking::setVehicleModel(const std::string& vehicleModel) /* Function: setAssignedTechnicianId -Description: Sets the ID of the technician assigned to the booking. -Parameter: const std::string& assignedTechnicianId - new technician ID -Return type: void +Description: Sets the ID of the assigned technician. +Parameters: + - assignedTechnicianId: New technician ID string. +Returns: + - void */ void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnicianId) { @@ -300,9 +318,11 @@ void ServiceBooking::setAssignedTechnician(User* assignedTechnician) /* Function: setDiscountPercentage -Description: Sets the discount percentage for the booking. -Parameter: double discountPercentage - new discount percentage -Return type: void +Description: Sets the discount percentage applied to the booking. +Parameters: + - discountPercentage: New discount percentage value. +Returns: + - void */ void ServiceBooking::setDiscountPercentage(double discountPercentage) { diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h index e949188..48e3ba9 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h @@ -40,8 +40,6 @@ public: const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel, - const std::string& assignedTechnicianId, - User* assignedTechnician, double discountPercentage ); const std::string& getId() const; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp index 52d85a9..0b0fa58 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp @@ -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 "Notification.h" #include "Enums.h" 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() : m_id("USR" + std::to_string(++m_uid)), m_type(util::UserType::CUSTOMER), 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) : m_id("USR" + std::to_string(++m_uid)), m_userName(userName), @@ -19,6 +50,14 @@ User::User(const std::string& userName, const std::string& password, const std:: m_type(role), 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() { 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 { 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 { 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 { 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 { 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 { 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 { return m_email; } +/* +Function: getNotifications +Description: Retrieves the map of notifications associated with the user. +Returns: + - util::Map& representing the notifications. +*/ util::Map& User::getNotifications() { return m_notifications; } +/* +Function: getUserType +Description: Retrieves the role of the user. +Returns: + - util::UserType representing the user role. +*/ util::UserType User::getUserType() const { 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 { 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) { 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) { 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) { 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) { 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) { 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) { m_email = email; } +/* +Function: addNotification +Description: Adds a new notification to the user’s notification map. +Parameters: + - notification: Pointer to the Notification object. +Returns: + - void +*/ 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) { 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) { m_status = status; } - -void User::update(Notification* notification) -{ -} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h index bde21e1..1c5c215 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h @@ -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 #include #include "Map.h" @@ -38,8 +47,7 @@ public: void setName(const std::string& name); void setPhone(const std::string& phone); void setEmail(const std::string& email); - void addNotification(Notification* notification); + void addNotification(Notification* notification) override; void setRole(util::UserType role); void setState(util::State status); - void update(Notification* notification) override; }; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp index ef48930..d3635e7 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp @@ -7,43 +7,50 @@ Author: Trenser Date:19-May-2026 */ #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 InventoryManagementService::m_observers{}; /* Function: addInventoryItem Description: Creates a new inventory item using the Factory and inserts it - into the DataStore. + into the DataStore. Parameter: const std::string& partName - name of the part - int quantity - initial quantity of the part - double price - price of the part + int quantity - initial quantity of the part + double price - price of the part Return type: void */ void InventoryManagementService::addInventoryItem(const std::string& partName, int quantity, double price) { - InventoryItem* newItem = Factory::getObject(partName, quantity, price); - m_dataStore.getInventoryItems().insert(newItem->getId(), newItem); + InventoryItem* newItem = Factory::getObject(partName, quantity, price); + m_dataStore.getInventoryItems().insert(newItem->getId(), newItem); } /* Function: addInventoryItemStock Description: Increases the stock quantity of an existing inventory item. Parameter: const std::string& selectedItemId - ID of the inventory item - int quantity - quantity to add + int quantity - quantity to add Return type: void */ void InventoryManagementService::addInventoryItemStock(const std::string& selectedItemId, int quantity) { - int index = m_dataStore.getInventoryItems().find(selectedItemId); - if (index != -1) - { - InventoryItem* item = m_dataStore.getInventoryItems().getValueAt(index); - if (item != nullptr) - { - int totalQuantity = item->getQuantity() + quantity; - item->setQuantity(totalQuantity); - } - } + int index = m_dataStore.getInventoryItems().find(selectedItemId); + if (index != -1) + { + InventoryItem* item = m_dataStore.getInventoryItems().getValueAt(index); + if (item != nullptr) + { + int totalQuantity = item->getQuantity() + quantity; + item->setQuantity(totalQuantity); + } + } } /* @@ -65,15 +72,15 @@ Return type: void */ void InventoryManagementService::removeInventoryItem(const std::string& inventoryItemID) { - int index = m_dataStore.getInventoryItems().find(inventoryItemID); - if (index != -1) - { - InventoryItem* item = m_dataStore.getInventoryItems().getValueAt(index); - if (item != nullptr) - { - item->setState(util::State::INACTIVE); - } - } + int index = m_dataStore.getInventoryItems().find(inventoryItemID); + if (index != -1) + { + InventoryItem* item = m_dataStore.getInventoryItems().getValueAt(index); + if (item != nullptr) + { + item->setState(util::State::INACTIVE); + } + } } /* @@ -84,10 +91,108 @@ Return type: InventoryItem* */ InventoryItem* InventoryManagementService::getInventoryItem(const std::string& inventoryItemID) { - int index = m_dataStore.getInventoryItems().find(inventoryItemID); - if (index != -1) - { - return m_dataStore.getInventoryItems().getValueAt(index); - } - return nullptr; -} \ No newline at end of file + int index = m_dataStore.getInventoryItems().find(inventoryItemID); + if (index != -1) + { + return m_dataStore.getInventoryItems().getValueAt(index); + } + return nullptr; +} + +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( + 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& 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(); + if (inventoryItems.isEmpty()) + { + return; + } + int inventoryItemsSize = inventoryItems.getSize(); + auto& usersMap = m_dataStore.getUsers(); + int usersMapSize = usersMap.getSize(); + util::Vector 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); + } + } +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h index b193b1d..18d0dda 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.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 #include #include "Subject.h" +#include "Notification.h" #include "User.h" class NotificationManagementService : public Subject diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp index 094e104..5ace3d8 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp @@ -1,13 +1,28 @@ -#include "PaymentManagementService.h" -#include "ServiceBooking.h" -#include "Service.h" -#include "InventoryItem.h" -#include "Utility.h" +/* +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 "Config.h" +#include "Enums.h" +#include +#include "Enums.h" #include "Factory.h" -#include "Timestamp.h" +#include "InventoryItem.h" #include "Invoice.h" #include "JobCard.h" -#include "Enums.h" +#include "PaymentManagementService.h" +#include "Service.h" +#include "ServiceBooking.h" +#include "Timestamp.h" +#include "User.h" +#include "Utility.h" + +util::Map PaymentManagementService::m_observers{}; static void createInventoryItemsMap(util::Map& completeInventoryItemMapOfBooking, const Service* currentService) { @@ -91,4 +106,120 @@ void PaymentManagementService::completePayment(const std::string& invoiceID, uti { throw std::runtime_error("Payment failed: invalid invoice ID."); } +} + +/* +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( + 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()); + } + } + } + } + } } \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h index 56a2fd2..c6e43a0 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h @@ -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 #include #include "Map.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index f63a516..a2c9768 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -8,23 +8,21 @@ Date:19-May-2026 */ #include #include "AuthenticationManagementService.h" -#include "AuthenticationManagementService.h" -#include "Service.h" -#include "ServiceBooking.h" #include "ComboPackage.h" -#include "Factory.h" -#include "UserManagementService.h" -#include "ServiceBooking.h" -#include "Factory.h" -#include "JobCard.h" -#include "Timestamp.h" -#include "Service.h" #include "Enums.h" +#include "Factory.h" #include "InventoryItem.h" -#include "AuthenticationManagementService.h" -#include "PaymentManagementService.h" +#include "JobCard.h" #include "NotificationManagementService.h" +#include "PaymentManagementService.h" +#include "Service.h" +#include "ServiceBooking.h" +#include "ServiceManagementService.h" +#include "Timestamp.h" #include "User.h" +#include "UserManagementService.h" + +util::Map ServiceManagementService::m_observers{}; util::Map ServiceManagementService::getServiceBookings() { @@ -514,3 +512,81 @@ void ServiceManagementService::removeComboPackage(const std::string& comboPackag throw std::runtime_error("Combo package with ID '" + comboPackageID + "' not found."); } } + +/* +Function: attach +Description: Attaches a user as an observer to the ServiceManagementService for receiving notifications. +Parameters: + - user: Pointer to the User object to be attached. +Returns: + - void +*/ +void ServiceManagementService::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 ServiceManagementService. +Parameters: + - user: Pointer to the User object to be detached. +Returns: + - void +*/ +void ServiceManagementService::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 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( + user->getId(), + user, + "ServiceManagementService: " + title, + message, + util::Timestamp() + ); + if (notification) + { + user->addNotification(notification); + } + else + { + throw std::runtime_error("Failed to create notification"); + } + } + } +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp index 44a36d7..ee20286 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp @@ -5,6 +5,7 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ +#include "UserManagementService.h" #include "Config.h" #include "Enums.h" #include "Factory.h" @@ -12,7 +13,7 @@ Date:19-May-2026 #include "PaymentManagementService.h" #include "ServiceManagementService.h" #include "User.h" -#include "UserManagementService.h" +#include "Vector.h" #include void UserManagementService::ensureAdminExists() @@ -140,3 +141,65 @@ void UserManagementService::removeUser(const std::string& userID) } } } + +/* +Function: getUserNotifications +Description: Retrieves all notifications associated with a given user ID. +Parameters: + - userID: The unique ID of the user whose notifications are to be retrieved. +Returns: + - util::Vector 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. +*/ +util::Vector UserManagementService::getUserNotifications(const std::string& userID) +{ + auto& usersMap = m_dataStore.getUsers(); + if (usersMap.find(userID) == -1) + { + throw std::runtime_error("No user found with given UserID"); + } + User* user = usersMap[userID]; + if (user) + { + auto& notifications = user->getNotifications(); + int numberOfNotifications = notifications.getSize(); + util::Vector notificationsVector; + for (int index = 0; index < numberOfNotifications; index++) + { + notificationsVector.push_back(notifications.getValueAt(index)); + } + return notificationsVector; + } + else + { + throw std::runtime_error("Invalid User object"); + } +} + +/* +Function: deleteNotification +Description: Deletes a specific notification associated with a given user ID. +Parameters: + - notificationID: The unique ID of the notification to be deleted. + - userID: The unique ID of the user whose notification is to be deleted. +Returns: + - void +Throws: + - std::runtime_error if no user is found with the given UserID or if no notification is found with the given NotificationID. +*/ +void UserManagementService::deleteNotification(const std::string& notificationID, const std::string& userID) +{ + auto& usersMap = m_dataStore.getUsers(); + if (usersMap.find(userID) == -1) + { + throw std::runtime_error("No user found with given UserID"); + } + User* user = usersMap[userID]; + auto& notifications = user->getNotifications(); + if (notifications.find(notificationID) == -1) + { + throw std::runtime_error("No notification found with given NotificationID"); + } + notifications.remove(notificationID); +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h index 6e122de..d1e6367 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h @@ -24,7 +24,7 @@ public: void updateUserDetails(const std::string& userID, const std::string& email, const std::string& phone); util::Map getUsers(); util::Map getUsers(util::UserType type); - User* getUser(const std::string& userID); + User* getUser (const std::string& userID); void removeUser(const std::string& userID); util::Vector getUserNotifications(const std::string& userID); void deleteNotification(const std::string& notificationID, const std::string& userID); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h index 38c7bed..e58012f 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h @@ -1,3 +1,11 @@ +/* +File: Config.h +Description: Defines configuration constants for system thresholds in the Vehicle Service Management System. + Includes limits for inventory stock alerts and payment reminder intervals. +Author: Trenser +Date: 21-May-2026 +*/ + #pragma once namespace config @@ -6,8 +14,14 @@ namespace config { constexpr const char* DEFAULT_ADMIN_USERNAME = "admin"; constexpr const char* DEFAULT_ADMIN_NAME = "admin"; - constexpr const char* DEFAULT_ADMIN_PASSWORD = ""; + constexpr const char* DEFAULT_ADMIN_PASSWORD = "admin"; constexpr const char* DEFAULT_ADMIN_EMAIL = "admin@vss"; constexpr const char* DEFAULT_ADMIN_PHONE = "0000000000"; } + + namespace threshold + { + constexpr int INVENTORY_LOW_STOCK_THRESHOLD = 5; + constexpr int PAYMENT_REMINDER_THRESHOLD_HOURS = 168; + } } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h index 893d382..d89217e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h @@ -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 #include @@ -37,6 +46,14 @@ namespace util 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) { switch (type) @@ -51,6 +68,16 @@ namespace util 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) { if (value == "ADMIN") @@ -68,6 +95,14 @@ namespace util 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) { switch (mode) @@ -82,6 +117,16 @@ namespace util 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) { if (value == "ONLINE") @@ -95,6 +140,14 @@ namespace util 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) { switch (status) @@ -107,6 +160,16 @@ namespace util 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) { if (value == "PENDING") @@ -122,6 +185,14 @@ namespace util 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) { switch (status) @@ -132,14 +203,22 @@ namespace util return "STARTED"; case ServiceJobStatus::COMPLETED: return "COMPLETED"; - case ServiceJobStatus::PENDING: - return "STARTED"; case ServiceJobStatus::CANCELLED: return "CANCELLED"; } 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) { if (value == "STARTED") @@ -161,6 +240,14 @@ namespace util 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) { switch (status) @@ -173,6 +260,16 @@ namespace util 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) { if (value == "ACTIVE") diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h index 5ae7404..ef8315b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h @@ -7,6 +7,7 @@ Date:19-May-2026 */ #pragma once #include "Service.h" +#include "ComboPackage.h" #include "InventoryItem.h" /* @@ -28,6 +29,15 @@ inline double calculatePartsCost(const Service* service) return cost; } +/* +Function: calculateComboServiceEstimatedCost +Description: Calculates the estimated total cost of a combo package by summing + the labor cost and parts cost of all services included in the package. +Parameters: + - comboPackage: const ComboPackage*, pointer to the combo package whose cost is to be estimated +Returns: + - double: The estimated total cost of the combo package +*/ inline double calculateComboServiceEstimatedCost(const ComboPackage* comboPackage) { double cost = 0; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 4a7cb6b..9134d8f 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -13,6 +13,7 @@ Date:19-May-2026 #include "Enums.h" #include "InputHelper.h" #include "InventoryItem.h" +#include "MenuHelper.h" #include "OutputHelper.h" #include "Service.h" #include "ServiceBooking.h" @@ -704,7 +705,7 @@ Return type: void void AdminMenu::addTechnician() { util::clear(); - std::string username, password, email, phoneNumber; + std::string username, name, password, email, phoneNumber; std::cout << std::left << std::setw(25) << "Enter Technician Username:"; util::read(username); std::cout << std::setw(25) << "Enter Technician Password:"; @@ -715,6 +716,8 @@ void AdminMenu::addTechnician() util::pressEnter(); return; } + std::cout << std::left << std::setw(25) << "Enter Technician Name:"; + util::read(name); std::cout << std::setw(25) << "Enter Technician Email:"; util::read(email); if(!util::isEmailValid(email)) @@ -731,7 +734,7 @@ void AdminMenu::addTechnician() util::pressEnter(); return; } - m_controller.createTechnician(username, password, email, phoneNumber); + m_controller.createTechnician(username, name, password, email, phoneNumber); std::cout << "\nTechnician Added Successfully.\n"; util::pressEnter(); } @@ -1018,6 +1021,15 @@ void AdminMenu::removeComboPackage() util::pressEnter(); } +/* +Function: viewNotifications +Description: Displays notifications for the admin and allows deletion of notifications. +Parameters: + - None +Returns: + - void +*/ void AdminMenu::viewNotifications() { + viewAndDeleteNotification(m_controller); } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp index 4d8c3c6..974057a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp @@ -1,3 +1,13 @@ +/* +File: CustomerMenu.cpp +Description: Implements the CustomerMenu class which provides the customer’s console interface + in the Vehicle Service Management System. Handles menu display, user input, and + customer-specific operations such as booking services, viewing history, managing payments, + invoices, and notifications. +Author: Trenser +Date: 19-May-2026 +*/ + #include #include #include "ComboPackage.h" @@ -7,6 +17,7 @@ #include "InventoryItem.h" #include "Invoice.h" #include "Map.h" +#include "MenuHelper.h" #include "OutputHelper.h" #include "Service.h" #include "ServiceBooking.h" @@ -16,6 +27,15 @@ #include "Validator.h" #include "Vector.h" +/* +Function: showMenu +Description: Displays the customer menu in a loop until the user chooses to logout. + Handles exceptions and ensures smooth user interaction. +Parameters: + - None +Returns: + - void +*/ void CustomerMenu::showMenu() { while (true) @@ -464,10 +484,66 @@ void CustomerMenu::viewInvoices() displayInvoices(currentUserInvoices); } +/* +Function: viewNotifications +Description: Displays notifications for the customer and allows deletion of notifications. +Parameters: + - None +Returns: + - void +*/ 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() { -} \ No newline at end of file + 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(); +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h index 886cf62..b65bb9d 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h @@ -1,3 +1,12 @@ +/* +File: CustomerMenu.h +Description: Declares the CustomerMenu class which provides the customer-facing console menu in the Vehicle Service Management System. + Supports operations such as account management, service selection, combo package booking, viewing service history, + handling payments and invoices, and managing notifications. +Author: Trenser +Date: 19-May-2026 +*/ + #pragma once #include "Controller.h" diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h index 3ff1134..20a0221 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h @@ -1,11 +1,32 @@ +/* +File: MenuHelper.h +Description: Provides inline utility functions to support menu operations in the Vehicle Service Management System. + Includes helper functions for selecting, displaying, and managing notifications, as well as + integrating with the controller for user interactions. +Author: Trenser +Date: 21-May-2026 +*/ + #pragma once #include #include +#include "Vector.h" +#include "Controller.h" #include "Notification.h" #include "Map.h" #include "InputHelper.h" #include "OutputHelper.h" +/* +Function: selectNotification +Description: Displays a list of notifications with index, ID, title, and timestamp, + then allows the user to select one by index. +Parameters: + - notifications: Vector of Notification pointers to be displayed. +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& notifications) { if (notifications.getSize() == 0) @@ -13,6 +34,7 @@ inline const Notification* selectNotification(const util::Vector indexedNotifications; std::cout << std::left << std::setw(6) << "Index" << std::setw(15) << "ID" @@ -20,9 +42,9 @@ inline const Notification* selectNotification(const util::VectorgetTitle() << std::setw(25) << currentNotification->getCreatedAt().toString() << std::endl; + indexedNotifications.insert(currentIndex, currentNotification); currentIndex++; } } int selectedIndex; std::cout << "Select notification: "; util::read(selectedIndex); - if (selectedIndex < 1 || selectedIndex > notifications.getSize()) + if (!indexedNotifications.containsKey(selectedIndex)) { std::cout << "Invalid selection." << std::endl; 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(); } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp index eadd3f4..c1e22c7 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp @@ -6,10 +6,12 @@ Description: Implementation file containing the method definitions of the Author: Trenser Date:19-May-2026 */ + #include #include "Enums.h" #include "InputHelper.h" #include "JobCard.h" +#include "MenuHelper.h" #include "OutputHelper.h" #include "Service.h" #include "TechnicianMenu.h" @@ -17,9 +19,12 @@ Date:19-May-2026 /* Function: showMenu -Description: Displays the technician menu and handles user input until logout is selected. -Parameter: None -Return type: void +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() { @@ -143,8 +148,17 @@ void TechnicianMenu::completeJob() } } +/* +Function: viewNotifications +Description: Displays notifications for the technician and allows deletion of notifications. +Parameters: + - None +Returns: + - void +*/ void TechnicianMenu::viewNotifications() { + viewAndDeleteNotification(m_controller); } /* @@ -155,7 +169,7 @@ Return type: void */ void TechnicianMenu::logout() { - m_controller.logout(); + m_controller.logout(); } /* @@ -166,21 +180,21 @@ Return type: void */ void TechnicianMenu::changePassword() { - std::string newPassword; - while (true) - { - util::clear(); - std::cout << "Enter new password: "; - util::read(newPassword); - if (!util::isPasswordValid(newPassword)) - { - std::cout << "Error: Password is not strong enough!\n"; - util::pressEnter(); - continue; - } - m_controller.changePassword(newPassword); - std::cout << "Password changed successfully\n"; - util::pressEnter(); - break; - } -} \ No newline at end of file + std::string newPassword; + while (true) + { + util::clear(); + std::cout << "Enter new password: "; + util::read(newPassword); + if (!util::isPasswordValid(newPassword)) + { + std::cout << "Error: Password is not strong enough!\n"; + util::pressEnter(); + continue; + } + m_controller.changePassword(newPassword); + std::cout << "Password changed successfully\n"; + util::pressEnter(); + break; + } +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp index 37239a0..2e7ee59 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp @@ -22,6 +22,7 @@ Return type: void */ void UserInterface::run() { + m_controller.runSystemChecks(); bool isMenuActive = true; while (isMenuActive) { @@ -113,6 +114,14 @@ void UserInterface::login() } } +/* +Function: registerCustomer +Description: Handles the registration process for new customers. +Parameters: + - None +Returns: + - void +*/ void UserInterface::registerCustomer() { std::string username, name, email, phone, password;