/* File: ServiceBooking.cpp Description: Implementation file containing the method definitions of the ServiceBooking class, including constructors, getters, and setters for booking attributes. Author: Trenser Date:19-May-2026 */ #include #include #include "ServiceBooking.h" #include "Service.h" #include "Enums.h" #include "Factory.h" #include "StringHelper.h" int ServiceBooking::m_uid = 0; /* Function: ServiceBooking 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)), m_customer(nullptr), m_assignedTechnician(nullptr), m_discountPercentage(0.0) {} /* Function: ServiceBooking Description: Parameterized constructor that initializes a service booking with customer, vehicle, technician, and discount details. Parameter: const std::string& id - booking ID util::ServiceJobStatus status - current booking status const util::Map& services - map of services const std::string& customerId - ID of the customer User* customer - pointer to the customer object const std::string& vehicleNumber - vehicle registration number const std::string& vehicleBrand - brand of the vehicle const std::string& vehicleModel - model of the vehicle double discountPercentage - discount applied to the booking Return type: Constructor */ ServiceBooking::ServiceBooking( util::ServiceJobStatus status, const util::Map& services, const std::string& customerId, User* customer, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel, double discountPercentage ) : m_id("SRV" + std::to_string(++m_uid)), m_status(status), m_services(services), m_customerId(customerId), m_customer(customer), m_vehicleNumber(vehicleNumber), m_vehicleBrand(vehicleBrand), m_vehicleModel(vehicleModel), m_assignedTechnicianId(""), m_assignedTechnician(nullptr), m_discountPercentage(discountPercentage) { int numberOfServices = m_services.getSize(); auto servicePointers = m_services.getValues(); for (int index = 0; index < numberOfServices; index++) { m_serviceIDs.push_back(servicePointers[index]->getId()); } } ServiceBooking::ServiceBooking( const std::string& id, util::ServiceJobStatus status, const util::Vector& serviceIDs, const std::string& customerId, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel, const std::string& assignedTechnicianId, double discountPercentage ) : m_id(id), m_status(status), m_serviceIDs(serviceIDs), m_customerId(customerId), m_customer(nullptr), m_vehicleNumber(vehicleNumber), m_vehicleBrand(vehicleBrand), m_vehicleModel(vehicleModel), m_assignedTechnicianId(assignedTechnicianId), m_assignedTechnician(nullptr), m_discountPercentage(discountPercentage) { int idNumber = util::extractNumber(m_id); if (idNumber > m_uid) { m_uid = idNumber; } } const std::string& ServiceBooking::getId() const { return m_id; } /* Function: getStatus Description: Retrieves the current status of the service booking. Returns: - util::ServiceJobStatus representing the booking status. */ util::ServiceJobStatus ServiceBooking::getStatus() const { return m_status; } const util::Vector& ServiceBooking::getServiceIDs() const { return m_serviceIDs; } /* Function: getServices Description: Retrieves the map of services included in the booking. Returns: - const util::Map& representing the services. */ const util::Map& ServiceBooking::getServices() const { return m_services; } /* Function: getCustomerId Description: Retrieves the customer ID associated with the booking. Returns: - const std::string& representing the customer ID. */ const std::string& ServiceBooking::getCustomerId() const { return m_customerId; } /* Function: getCustomer Description: Retrieves the pointer to the associated customer. Returns: - User* representing the customer. */ User* ServiceBooking::getCustomer() const { return m_customer; } /* Function: getVehicleNumber Description: Retrieves the vehicle registration number. Returns: - const std::string& representing the vehicle number. */ const std::string& ServiceBooking::getVehicleNumber() const { return m_vehicleNumber; } /* Function: getVehicleBrand Description: Retrieves the brand of the vehicle. Returns: - const std::string& representing the vehicle brand. */ const std::string& ServiceBooking::getVehicleBrand() const { return m_vehicleBrand; } /* Function: getVehicleModel Description: Retrieves the model of the vehicle. Returns: - const std::string& representing the vehicle model. */ const std::string& ServiceBooking::getVehicleModel() const { return m_vehicleModel; } /* Function: getAssignedTechnicianId Description: Retrieves the ID of the assigned technician. Returns: - const std::string& representing the technician ID. */ const std::string& ServiceBooking::getAssignedTechnicianId() const { return m_assignedTechnicianId; } /* Function: getAssignedTechnician Description: Retrieves the technician object assigned to the booking. Parameter: None Return type: User* */ User* ServiceBooking::getAssignedTechnician() const { return m_assignedTechnician; } /* Function: getDiscountPercentage Description: Retrieves the discount percentage applied to the booking. Returns: - double representing the discount percentage. */ double ServiceBooking::getDiscountPercentage() const { return m_discountPercentage; } /* Function: setId Description: Sets the unique ID of the service booking. Parameters: - id: New booking ID string. Returns: - void */ void ServiceBooking::setId(const std::string& id) { m_id = id; } /* Function: setStatus Description: Sets the current status of the service booking. Parameters: - status: New booking status value. Returns: - void */ void ServiceBooking::setStatus(const util::ServiceJobStatus& status) { m_status = status; } /* Function: setServices Description: Sets the services included in the booking. Parameters: - services: Map of services. Returns: - void */ void ServiceBooking::setServices(const util::Map& services) { m_services = services; m_serviceIDs.clear(); int numberOfServices = m_services.getSize(); auto servicePointers = m_services.getValues(); for (int index = 0; index < numberOfServices; index++) { m_serviceIDs.push_back(servicePointers[index]->getId()); } } /* Function: setCustomerId Description: Sets the customer ID associated with the booking. Parameters: - customerId: New customer ID string. Returns: - void */ void ServiceBooking::setCustomerId(const std::string& customerId) { m_customerId = customerId; } /* Function: setCustomer Description: Sets the pointer to the associated customer. Parameters: - customer: Pointer to the User object. Returns: - void */ void ServiceBooking::setCustomer(User* customer) { m_customer = customer; } /* Function: setVehicleNumber Description: Sets the vehicle registration number. Parameters: - vehicleNumber: New vehicle number string. Returns: - void */ void ServiceBooking::setVehicleNumber(const std::string& vehicleNumber) { m_vehicleNumber = vehicleNumber; } /* Function: setVehicleBrand Description: Sets the brand of the vehicle. Parameters: - vehicleBrand: New vehicle brand string. Returns: - void */ void ServiceBooking::setVehicleBrand(const std::string& vehicleBrand) { m_vehicleBrand = vehicleBrand; } /* Function: setVehicleModel Description: Sets the model of the vehicle. Parameters: - vehicleModel: New vehicle model string. Returns: - void */ void ServiceBooking::setVehicleModel(const std::string& vehicleModel) { m_vehicleModel = vehicleModel; } /* Function: setAssignedTechnicianId Description: Sets the ID of the assigned technician. Parameters: - assignedTechnicianId: New technician ID string. Returns: - void */ void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnicianId) { m_assignedTechnicianId = assignedTechnicianId; } /* Function: setAssignedTechnician Description: Sets the technician object assigned to the booking. Parameter: User* assignedTechnician - pointer to the technician object Return type: void */ void ServiceBooking::setAssignedTechnician(User* assignedTechnician) { m_assignedTechnician = assignedTechnician; } /* Function: setDiscountPercentage Description: Sets the discount percentage applied to the booking. Parameters: - discountPercentage: New discount percentage value. Returns: - void */ void ServiceBooking::setDiscountPercentage(double discountPercentage) { m_discountPercentage = discountPercentage; } static std::string getServiceIDsAsString(const util::Vector& serviceIDs) { int numberOfServices = serviceIDs.getSize(); std::string serviceIDsString; for (int index = 0; index < numberOfServices; index++) { serviceIDsString += serviceIDs[index]; if (index < numberOfServices - 1) { serviceIDsString += '|'; } } return serviceIDsString; } static util::Vector getServiceIDsAsVector(const std::string& serviceIDsString) { util::Vector serviceIDs; std::string serviceID; std::istringstream serializedServiceIDs(serviceIDsString); while (getline(serializedServiceIDs, serviceID, '|')) { serviceIDs.push_back(serviceID); } return serviceIDs; } std::string ServiceBooking::serialize() const { std::ostringstream serializedBooking; serializedBooking << m_id << ',' << util::getServiceJobStatusString(m_status) << ',' << getServiceIDsAsString(m_serviceIDs) << ',' << m_customerId << ',' << m_vehicleNumber << ',' << m_vehicleBrand << ',' << m_vehicleModel << ',' << m_assignedTechnicianId << ',' << m_discountPercentage << ','; return serializedBooking.str(); } ServiceBooking* ServiceBooking::deserialize(const std::string& record) { std::string id, customerId, vehicleNumber, vehicleBrand, vehicleModel, assignedTechnicianId; std::string serviceJobStatusString, serviceIDsString, discountPercentageString; double discountPercentage; std::istringstream serializedBooking(record); getline(serializedBooking, id, ','); getline(serializedBooking, serviceJobStatusString, ','); getline(serializedBooking, serviceIDsString, ','); getline(serializedBooking, customerId, ','); getline(serializedBooking, vehicleNumber, ','); getline(serializedBooking, vehicleBrand, ','); getline(serializedBooking, vehicleModel, ','); getline(serializedBooking, assignedTechnicianId, ','); getline(serializedBooking, discountPercentageString, ','); util::Vector serviceIDs = getServiceIDsAsVector(serviceIDsString); try { discountPercentage = std::stod(discountPercentageString); } catch (...) { throw std::runtime_error("Invalid discount percentage"); } util::ServiceJobStatus status = util::getServiceJobStatus(serviceJobStatusString); return Factory::getObject( id, status, serviceIDs, customerId, vehicleNumber, vehicleBrand, vehicleModel, assignedTechnicianId, discountPercentage ); } std::string ServiceBooking::getHeaders() { return "ID,Status,ServiceIDs,CustomerID,VehicleNumber,VehicleBrand,VehicleModel,AssignedTechnicianID,DiscountPercentage"; }