462 lines
12 KiB
C++
462 lines
12 KiB
C++
/*
|
|
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 <stdexcept>
|
|
#include <sstream>
|
|
#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<std::string, Service*>& 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<std::string,
|
|
Service*>& 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<std::string>& 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<std::string>& ServiceBooking::getServiceIDs() const
|
|
{
|
|
return m_serviceIDs;
|
|
}
|
|
|
|
/*
|
|
Function: getServices
|
|
Description: Retrieves the map of services included in the booking.
|
|
Returns:
|
|
- const util::Map<std::string, Service*>& representing the services.
|
|
*/
|
|
const util::Map<std::string, Service*>& 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<std::string, Service*>& 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<std::string>& 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<std::string> getServiceIDsAsVector(const std::string& serviceIDsString)
|
|
{
|
|
util::Vector<std::string> 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<std::string> 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<ServiceBooking>(
|
|
id,
|
|
status,
|
|
serviceIDs,
|
|
customerId,
|
|
vehicleNumber,
|
|
vehicleBrand,
|
|
vehicleModel,
|
|
assignedTechnicianId,
|
|
discountPercentage
|
|
);
|
|
}
|
|
|
|
std::string ServiceBooking::getHeaders()
|
|
{
|
|
return "ID,Status,ServiceIDs,CustomerID,VehicleNumber,VehicleBrand,VehicleModel,AssignedTechnicianID,DiscountPercentage";
|
|
}
|