diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
index a65c46d..f9b2eaf 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
@@ -171,11 +171,16 @@
+
+
+
+
+
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
index 77d0509..28cbc00 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
@@ -233,5 +233,20 @@
Header Files\Models
+
+ Header Files\Utilities
+
+
+ Header Files\Utilities
+
+
+ Header Files\Utilities
+
+
+ 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 d536e8a..a6f230d 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp
@@ -141,6 +141,34 @@ void Controller::configureNotifications(const std::string& userID, bool paymentN
{
}
+void Controller::loadSystemData()
+{
+ m_userManagementService.loadUsers();
+ m_inventoryManagementService.loadInventoryItems();
+ m_serviceManagementService.loadServices();
+ m_serviceManagementService.loadComboPackages();
+ m_serviceManagementService.loadServiceBookings();
+ m_serviceManagementService.loadJobCards();
+ m_paymentManagementService.loadInvoices();
+ m_serviceManagementService.loadObservers();
+ m_paymentManagementService.loadObservers();
+ m_inventoryManagementService.loadObservers();
+}
+
+void Controller::saveSystemData()
+{
+ m_userManagementService.saveUsers();
+ m_inventoryManagementService.saveInventoryItems();
+ m_serviceManagementService.saveServices();
+ m_serviceManagementService.saveComboPackages();
+ m_serviceManagementService.saveServiceBookings();
+ m_serviceManagementService.saveJobCards();
+ m_paymentManagementService.saveInvoices();
+ m_serviceManagementService.saveObservers();
+ m_paymentManagementService.saveObservers();
+ m_inventoryManagementService.saveObservers();
+}
+
void Controller::runSystemChecks()
{
}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h
index 3aabb58..863aba3 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h
@@ -2,6 +2,10 @@
#include "Map.h"
#include
#include "Enums.h"
+#include "InventoryManagementService.h"
+#include "UserManagementService.h"
+#include "ServiceManagementService.h"
+#include "PaymentManagementService.h"
class Service;
class ComboPackage;
@@ -14,6 +18,11 @@ class Notification;
class Controller
{
+private:
+ UserManagementService m_userManagementService;
+ InventoryManagementService m_inventoryManagementService;
+ ServiceManagementService m_serviceManagementService;
+ PaymentManagementService m_paymentManagementService;
public:
bool login(const std::string& username, const std::string& password);
void logout();
@@ -47,5 +56,7 @@ public:
util::Vector getNotifications();
void deleteNotification(const std::string& notificationID);
void configureNotifications(const std::string& userID, bool paymentNotifications, bool serviceNotifications);
+ void loadSystemData();
+ void saveSystemData();
void runSystemChecks();
};
\ 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..3981440 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Subject.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Subject.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "Map.h"
+#include "Vector.h"
class User;
class Notification;
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/files/README.md b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/files/README.md
new file mode 100644
index 0000000..6e6b93e
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/files/README.md
@@ -0,0 +1 @@
+Place files here.
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp
index 6216922..c76d727 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.cpp
@@ -1,4 +1,9 @@
+#include
+#include
#include "ComboPackage.h"
+#include "Service.h"
+#include "Factory.h"
+#include "StringHelper.h"
int ComboPackage::m_uid = 0;
@@ -12,7 +17,29 @@ ComboPackage::ComboPackage(const std::string& packageName, double discountPercen
m_packageName(packageName),
m_discountPercentage(discountPercentage),
m_status(util::State::ACTIVE),
- m_services(services) {}
+ m_services(services)
+{
+ int numberOfServices = m_services.getSize();
+ auto servicePointers = m_services.getValues();
+ for (int index = 0; index < numberOfServices; index++)
+ {
+ m_serviceIDs.push_back(servicePointers[index]->getId());
+ }
+}
+
+ComboPackage::ComboPackage(const std::string& id, const std::string& packageName, double discountPercentage, const util::Vector& serviceIDs, util::State status)
+ : m_id(id),
+ m_packageName(packageName),
+ m_discountPercentage(discountPercentage),
+ m_serviceIDs(serviceIDs),
+ m_status(status)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
const std::string& ComboPackage::getId() const
{
@@ -34,6 +61,11 @@ util::State ComboPackage::getState() const
return m_status;
}
+const util::Vector& ComboPackage::getServiceIDs() const
+{
+ return m_serviceIDs;
+}
+
const util::Map& ComboPackage::getServices() const
{
return m_services;
@@ -57,9 +89,89 @@ void ComboPackage::setDiscountPercentage(double discountPercentage)
void ComboPackage::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());
+ }
}
void ComboPackage::setState(util::State status)
{
m_status = status;
}
+
+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 ComboPackage::serialize() const
+{
+ std::ostringstream serializedComboPackage;
+ serializedComboPackage << m_id << ','
+ << m_packageName << ','
+ << m_discountPercentage << ','
+ << getServiceIDsAsString(m_serviceIDs) << ','
+ << util::getStateString(m_status);
+ return serializedComboPackage.str();
+}
+
+ComboPackage* ComboPackage::deserialize(const std::string& record)
+{
+ std::string id, packageName;
+ std::string discountPercentageString, serviceIDsString, statusString;
+ double discountPercentage;
+ std::istringstream serializedComboPackage(record);
+ getline(serializedComboPackage, id, ',');
+ getline(serializedComboPackage, packageName, ',');
+ getline(serializedComboPackage, discountPercentageString, ',');
+ getline(serializedComboPackage, serviceIDsString, ',');
+ getline(serializedComboPackage, statusString, ',');
+ try
+ {
+ discountPercentage = std::stod(discountPercentageString);
+ }
+ catch (...)
+ {
+ throw std::runtime_error("Invalid combo package data");
+ }
+ util::Vector serviceIDs = getServiceIDsAsVector(serviceIDsString);
+ util::State status = util::getState(statusString);
+ return Factory::getObject(
+ id,
+ packageName,
+ discountPercentage,
+ serviceIDs,
+ status
+ );
+}
+
+std::string ComboPackage::getHeaders()
+{
+ return "ID,PackageName,DiscountPercentage,ServiceIDs,Status";
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h
index 4b28d54..36e32dd 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ComboPackage.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "Map.h"
+#include "Vector.h"
#include "Enums.h"
class Service;
@@ -12,14 +13,17 @@ private:
std::string m_id;
std::string m_packageName;
double m_discountPercentage;
+ util::Vector m_serviceIDs;
util::Map m_services;
util::State m_status;
public:
ComboPackage();
ComboPackage(const std::string& packageName, double discountPercentage, const util::Map& services);
+ ComboPackage(const std::string& id, const std::string& packageName, double discountPercentage, const util::Vector& serviceIDs, util::State status);
const std::string& getId() const;
const std::string& getPackageName() const;
double getDiscountPercentage() const;
+ const util::Vector& getServiceIDs() const;
const util::Map& getServices() const;
util::State getState() const;
void setId(const std::string& id);
@@ -27,4 +31,7 @@ public:
void setDiscountPercentage(double discountPercentage);
void setServices(const util::Map& services);
void setState(util::State status);
+ std::string serialize() const;
+ static ComboPackage* deserialize(const std::string&);
+ static std::string getHeaders();
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp
index c3dbbaa..da0fd3c 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.cpp
@@ -1,3 +1,7 @@
+#include
+#include
+#include "Factory.h"
+#include "StringHelper.h"
#include "InventoryItem.h"
int InventoryItem::m_uid = 0;
@@ -15,6 +19,20 @@ InventoryItem::InventoryItem(const std::string& partName, int quantity, double p
m_status(util::State::ACTIVE),
m_price(price) {}
+InventoryItem::InventoryItem(const std::string& id, const std::string& partName, int quantity, double price, util::State status)
+ : m_id(id),
+ m_partName(partName),
+ m_quantity(quantity),
+ m_status(status),
+ m_price(price)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
+
const std::string& InventoryItem::getId() const
{
return m_id;
@@ -63,4 +81,51 @@ void InventoryItem::setPrice(double price)
void InventoryItem::setState(util::State status)
{
m_status = status;
-}
\ No newline at end of file
+}
+
+std::string InventoryItem::serialize() const
+{
+ std::ostringstream serializedInventoryItem;
+ serializedInventoryItem << m_id << ','
+ << m_partName << ','
+ << m_quantity << ','
+ << m_price << ','
+ << util::getStateString(m_status);
+ return serializedInventoryItem.str();
+}
+
+InventoryItem* InventoryItem::deserialize(const std::string& record)
+{
+ std::string id, partName;
+ std::string quantityString, priceString, statusString;
+ int quantity;
+ double price;
+ std::istringstream serializedInventoryItem(record);
+ getline(serializedInventoryItem, id, ',');
+ getline(serializedInventoryItem, partName, ',');
+ getline(serializedInventoryItem, quantityString, ',');
+ getline(serializedInventoryItem, priceString, ',');
+ getline(serializedInventoryItem, statusString, ',');
+ try
+ {
+ quantity = std::stoi(quantityString);
+ price = std::stod(priceString);
+ }
+ catch (...)
+ {
+ throw std::runtime_error("Invalid inventory item data");
+ }
+ util::State status = util::getState(statusString);
+ return Factory::getObject(
+ id,
+ partName,
+ quantity,
+ price,
+ status
+ );
+}
+
+std::string InventoryItem::getHeaders()
+{
+ return "ID,PartName,Quantity,Price,Status";
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h
index d9618bc..6a9b237 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/InventoryItem.h
@@ -14,6 +14,7 @@ private:
public:
InventoryItem();
InventoryItem(const std::string& partName, int quantity, double price);
+ InventoryItem(const std::string& id, const std::string& partName, int quantity, double price, util::State status);
const std::string& getId() const;
const std::string& getPartName() const;
int getQuantity() const;
@@ -24,4 +25,7 @@ public:
void setQuantity(int quantity);
void setPrice(double price);
void setState(util::State status);
+ std::string serialize() const;
+ static InventoryItem* deserialize(const std::string&);
+ static std::string getHeaders();
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp
index ba7bc84..622988e 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.cpp
@@ -1,4 +1,9 @@
+#include
+#include
#include "Invoice.h"
+#include "Factory.h"
+#include "InventoryItem.h"
+#include "StringHelper.h"
int Invoice::m_uid = 0;
@@ -16,7 +21,7 @@ Invoice::Invoice(
const std::string& bookingId,
ServiceBooking* booking,
const util::Timestamp& invoiceDate,
- double laborCost, const util::Map& parts,
double partsCost,
double discountPercentage,
@@ -36,7 +41,48 @@ Invoice::Invoice(
m_totalAmount(totalAmount),
m_paymentDate(paymentDate),
m_paymentMethod(paymentMethod),
- m_status(status) {}
+ m_status(status)
+{
+ int numberOfParts = m_parts.getSize();
+ auto partPointers = m_parts.getValues();
+ for (int index = 0; index < numberOfParts; index++)
+ {
+ m_partIDs.push_back(partPointers[index]->getId());
+ }
+}
+
+Invoice::Invoice(
+ const std::string& id,
+ const std::string& bookingId,
+ const util::Timestamp& invoiceDate,
+ const util::Vector& partIDs,
+ double laborCost,
+ double partsCost,
+ double discountPercentage,
+ double totalAmount,
+ const util::Timestamp& paymentDate,
+ util::PaymentMode paymentMethod,
+ util::PaymentStatus status
+)
+ : m_id(id),
+ m_bookingId(bookingId),
+ m_booking(nullptr),
+ m_invoiceDate(invoiceDate),
+ m_partIDs(partIDs),
+ m_laborCost(laborCost),
+ m_partsCost(partsCost),
+ m_discountPercentage(discountPercentage),
+ m_totalAmount(totalAmount),
+ m_paymentDate(paymentDate),
+ m_paymentMethod(paymentMethod),
+ m_status(status)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
const std::string& Invoice::getId() const
{
@@ -63,7 +109,12 @@ double Invoice::getLaborCost() const
return m_laborCost;
}
-const util::Map& Invoice::getParts() const
+const util::Vector& Invoice::getPartIDs() const
+{
+ return m_partIDs;
+}
+
+const util::Map& Invoice::getParts() const
{
return m_parts;
}
@@ -123,9 +174,16 @@ void Invoice::setLaborCost(double laborCost)
m_laborCost = laborCost;
}
-void Invoice::setParts(const util::Map& parts)
+void Invoice::setParts(const util::Map& parts)
{
m_parts = parts;
+ m_partIDs.clear();
+ int numberOfParts = m_parts.getSize();
+ auto partPointers = m_parts.getValues();
+ for (int index = 0; index < numberOfParts; index++)
+ {
+ m_partIDs.push_back(partPointers[index]->getId());
+ }
}
void Invoice::setPartsCost(double partsCost)
@@ -157,3 +215,104 @@ void Invoice::setStatus(util::PaymentStatus status)
{
m_status = status;
}
+
+static std::string getPartIDsAsString(const util::Vector& partIDs)
+{
+ int numberOfParts = partIDs.getSize();
+ std::string partIDsString;
+ for (int index = 0; index < numberOfParts; index++)
+ {
+ partIDsString += partIDs[index];
+ if (index < numberOfParts - 1)
+ {
+ partIDsString += '|';
+ }
+ }
+ return partIDsString;
+}
+
+static util::Vector getPartIDsAsVector(const std::string& partIDsString)
+{
+ util::Vector partIDs;
+ std::string partID;
+ std::istringstream serializedPartIDs(partIDsString);
+ while (getline(serializedPartIDs, partID, '|'))
+ {
+ partIDs.push_back(partID);
+ }
+ return partIDs;
+}
+
+std::string Invoice::serialize() const
+{
+ std::ostringstream serializedInvoice;
+ serializedInvoice << m_id << ','
+ << m_bookingId << ','
+ << m_invoiceDate.toString() << ','
+ << m_laborCost << ','
+ << getPartIDsAsString(m_partIDs) << ','
+ << m_partsCost << ','
+ << m_discountPercentage << ','
+ << m_totalAmount << ','
+ << m_paymentDate.toString() << ','
+ << util::getPaymentModeString(m_paymentMethod) << ','
+ << util::getPaymentStatusString(m_status);
+ return serializedInvoice.str();
+}
+
+Invoice* Invoice::deserialize(const std::string& record)
+{
+ std::string id, bookingId;
+ std::string invoiceDateString, laborCostString, partIDsString;
+ std::string partsCostString, discountPercentageString, totalAmountString;
+ std::string paymentDateString, paymentMethodString, statusString;
+ double laborCost, partsCost, discountPercentage, totalAmount;
+ std::istringstream serializedInvoice(record);
+ getline(serializedInvoice, id, ',');
+ getline(serializedInvoice, bookingId, ',');
+ getline(serializedInvoice, invoiceDateString, ',');
+ getline(serializedInvoice, laborCostString, ',');
+ getline(serializedInvoice, partIDsString, ',');
+ getline(serializedInvoice, partsCostString, ',');
+ getline(serializedInvoice, discountPercentageString, ',');
+ getline(serializedInvoice, totalAmountString, ',');
+ getline(serializedInvoice, paymentDateString, ',');
+ getline(serializedInvoice, paymentMethodString, ',');
+ getline(serializedInvoice, statusString, ',');
+ util::Timestamp invoiceDate;
+ util::Timestamp paymentDate;
+ try
+ {
+ invoiceDate = util::Timestamp::fromString(invoiceDateString);
+ paymentDate = util::Timestamp::fromString(paymentDateString);
+ laborCost = std::stod(laborCostString);
+ partsCost = std::stod(partsCostString);
+ discountPercentage = std::stod(discountPercentageString);
+ totalAmount = std::stod(totalAmountString);
+ }
+ catch (...)
+ {
+ throw std::runtime_error("Invalid invoice data");
+ }
+ util::Vector partIDs = getPartIDsAsVector(partIDsString);
+ util::PaymentMode paymentMethod = util::getPaymentMode(paymentMethodString);
+ util::PaymentStatus status = util::getPaymentStatus(statusString);
+ return Factory::getObject(
+ id,
+ bookingId,
+ invoiceDate,
+ partIDs,
+ laborCost,
+ partsCost,
+ discountPercentage,
+ totalAmount,
+ paymentDate,
+ paymentMethod,
+ status
+ );
+}
+
+std::string Invoice::getHeaders()
+{
+ return "ID,BookingID,InvoiceDate,LaborCost,PartIDs,PartsCost,DiscountPercentage,TotalAmount,PaymentDate,PaymentMethod,Status";
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h
index 212d33f..bbbbb0e 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Invoice.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "Map.h"
+#include "Vector.h"
#include "Timestamp.h"
#include "Enums.h"
@@ -16,21 +17,21 @@ private:
ServiceBooking* m_booking;
util::Timestamp m_invoiceDate;
double m_laborCost;
- util::Map m_parts;
+ util::Vector m_partIDs;
+ util::Map m_parts;
double m_partsCost;
double m_discountPercentage;
double m_totalAmount;
util::Timestamp m_paymentDate;
util::PaymentMode m_paymentMethod;
util::PaymentStatus m_status;
-
public:
Invoice();
Invoice(
const std::string& bookingId,
ServiceBooking* booking,
const util::Timestamp& invoiceDate,
- double laborCost, const util::Map& parts,
double partsCost,
double discountPercentage,
@@ -39,12 +40,26 @@ public:
util::PaymentMode paymentMethod,
util::PaymentStatus status
);
+ Invoice(
+ const std::string& id,
+ const std::string& bookingId,
+ const util::Timestamp& invoiceDate,
+ const util::Vector& partIDs,
+ double laborCost,
+ double partsCost,
+ double discountPercentage,
+ double totalAmount,
+ const util::Timestamp& paymentDate,
+ util::PaymentMode paymentMethod,
+ util::PaymentStatus status
+ );
const std::string& getId() const;
const std::string& getBookingId() const;
ServiceBooking* getBooking() const;
const util::Timestamp& getInvoiceDate() const;
double getLaborCost() const;
- const util::Map& getParts() const;
+ const util::Vector& getPartIDs() const;
+ const util::Map& getParts() const;
double getPartsCost() const;
double getDiscountPercentage() const;
double getTotalAmount() const;
@@ -56,11 +71,14 @@ public:
void setBooking(ServiceBooking* booking);
void setInvoiceDate(const util::Timestamp& invoiceDate);
void setLaborCost(double laborCost);
- void setParts(const util::Map& parts);
+ void setParts(const util::Map& parts);
void setPartsCost(double partsCost);
void setDiscountPercentage(double discountPercentage);
void setTotalAmount(double totalAmount);
void setPaymentDate(const util::Timestamp& paymentDate);
void setPaymentMethod(util::PaymentMode paymentMethod);
void setStatus(util::PaymentStatus status);
+ std::string serialize() const;
+ static Invoice* deserialize(const std::string&);
+ static std::string getHeaders();
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp
index 04e9195..6683dc1 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.cpp
@@ -1,4 +1,9 @@
+#include
+#include
#include "JobCard.h"
+#include "Factory.h"
+#include "StringHelper.h"
+#include "Enums.h"
int JobCard::m_uid = 0;
@@ -7,7 +12,7 @@ JobCard::JobCard()
m_booking(nullptr),
m_service(nullptr),
m_technician(nullptr),
- m_status(ServiceJobStatus()) {}
+ m_status(util::ServiceJobStatus()) {}
JobCard::JobCard(const std::string& bookingId,
ServiceBooking* booking,
@@ -16,7 +21,7 @@ JobCard::JobCard(const std::string& bookingId,
const std::string& technicianId,
User* technician,
const util::Timestamp& assignedDate,
- ServiceJobStatus status,
+ util::ServiceJobStatus status,
const util::Timestamp& completionDate
)
: m_id("JC" + std::to_string(++m_uid)),
@@ -30,6 +35,32 @@ JobCard::JobCard(const std::string& bookingId,
m_status(status),
m_completionDate(completionDate) {}
+JobCard::JobCard(const std::string& id,
+ const std::string& bookingId,
+ const std::string& serviceId,
+ const std::string& technicianId,
+ const util::Timestamp& assignedDate,
+ util::ServiceJobStatus status,
+ const util::Timestamp& completionDate
+)
+ : m_id(id),
+ m_bookingId(bookingId),
+ m_booking(nullptr),
+ m_service(nullptr),
+ m_serviceId(serviceId),
+ m_technicianId(technicianId),
+ m_technician(nullptr),
+ m_assignedDate(assignedDate),
+ m_status(status),
+ m_completionDate(completionDate)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
+
const std::string& JobCard::getId() const
{
return m_id;
@@ -70,7 +101,7 @@ const util::Timestamp& JobCard::getAssignedDate() const
return m_assignedDate;
}
-ServiceJobStatus JobCard::getStatus() const
+util::ServiceJobStatus JobCard::getStatus() const
{
return m_status;
}
@@ -120,7 +151,7 @@ void JobCard::setAssignedDate(const util::Timestamp& assignedDate)
m_assignedDate = assignedDate;
}
-void JobCard::setStatus(ServiceJobStatus status)
+void JobCard::setStatus(util::ServiceJobStatus status)
{
m_status = status;
}
@@ -128,4 +159,57 @@ void JobCard::setStatus(ServiceJobStatus status)
void JobCard::setCompletionDate(const util::Timestamp& completionDate)
{
m_completionDate = completionDate;
+}
+
+std::string JobCard::serialize() const
+{
+ std::ostringstream serializedJobCard;
+ serializedJobCard << m_id << ','
+ << m_bookingId << ','
+ << m_serviceId << ','
+ << m_technicianId << ','
+ << m_assignedDate.toString() << ','
+ << util::getServiceJobStatusString(m_status) << ','
+ << m_completionDate.toString();
+ return serializedJobCard.str();
+}
+
+JobCard* JobCard::deserialize(const std::string& record)
+{
+ std::string id, bookingId, serviceId, technicianId;
+ std::string assignedDateString, statusString, completionDateString;
+ std::istringstream serializedJobCard(record);
+ getline(serializedJobCard, id, ',');
+ getline(serializedJobCard, bookingId, ',');
+ getline(serializedJobCard, serviceId, ',');
+ getline(serializedJobCard, technicianId, ',');
+ getline(serializedJobCard, assignedDateString, ',');
+ getline(serializedJobCard, statusString, ',');
+ getline(serializedJobCard, completionDateString, ',');
+ util::Timestamp assignedDate;
+ util::Timestamp completionDate;
+ try
+ {
+ assignedDate = util::Timestamp::fromString(assignedDateString);
+ completionDate = util::Timestamp::fromString(completionDateString);
+ }
+ catch (...)
+ {
+ throw std::runtime_error("Invalid timestamp");
+ }
+ util::ServiceJobStatus status = util::getServiceJobStatus(statusString);
+ return Factory::getObject(
+ id,
+ bookingId,
+ serviceId,
+ technicianId,
+ assignedDate,
+ status,
+ completionDate
+ );
+}
+
+std::string JobCard::getHeaders()
+{
+ return "ID,BookingID,ServiceID,TechnicianID,AssignedDate,Status,CompletionDate";
}
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h
index 15a8a5d..21cdf44 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/JobCard.h
@@ -1,13 +1,12 @@
#pragma once
#include
#include "Timestamp.h"
+#include "Enums.h"
class ServiceBooking;
class Service;
class User;
-enum class ServiceJobStatus : int;
-
class JobCard
{
private:
@@ -20,7 +19,7 @@ private:
std::string m_technicianId;
User* m_technician;
util::Timestamp m_assignedDate;
- ServiceJobStatus m_status;
+ util::ServiceJobStatus m_status;
util::Timestamp m_completionDate;
public:
@@ -32,7 +31,15 @@ public:
const std::string& technicianId,
User* technician,
const util::Timestamp& assignedDate,
- ServiceJobStatus status,
+ util::ServiceJobStatus status,
+ const util::Timestamp& completionDate
+ );
+ JobCard(const std::string& id,
+ const std::string& bookingId,
+ const std::string& serviceId,
+ const std::string& technicianId,
+ const util::Timestamp& assignedDate,
+ util::ServiceJobStatus status,
const util::Timestamp& completionDate
);
const std::string& getId() const;
@@ -43,7 +50,7 @@ public:
const std::string& getTechnicianId() const;
User* getTechnician() const;
const util::Timestamp& getAssignedDate() const;
- ServiceJobStatus getStatus() const;
+ util::ServiceJobStatus getStatus() const;
const util::Timestamp& getCompletionDate() const;
void setId(const std::string& id);
void setBookingId(const std::string& bookingId);
@@ -53,6 +60,9 @@ public:
void setTechnicianId(const std::string& technicianId);
void setTechnician(User* technician);
void setAssignedDate(const util::Timestamp& assignedDate);
- void setStatus(ServiceJobStatus status);
+ void setStatus(util::ServiceJobStatus status);
void setCompletionDate(const util::Timestamp& completionDate);
+ std::string serialize() const;
+ static JobCard* deserialize(const std::string&);
+ static std::string getHeaders();
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp
index dc3ed1d..86eaaec 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp
@@ -1,4 +1,7 @@
+#include
#include "Notification.h"
+#include "StringHelper.h"
+#include "Factory.h"
int Notification::m_uid = 0;
@@ -14,6 +17,21 @@ Notification::Notification(const std::string& recipientUserId, User* recipient,
m_message(message),
m_createdAt(createdAt) {}
+Notification::Notification(const std::string& id, const std::string& recipientUserId, const std::string& title, const std::string& message, const util::Timestamp& createdAt)
+ : m_id(id),
+ m_recipientUserId(recipientUserId),
+ m_recipient(nullptr),
+ m_title(title),
+ m_message(message),
+ m_createdAt(createdAt)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
+
const std::string& Notification::getId() const
{
return m_id;
@@ -72,4 +90,47 @@ void Notification::setMessage(const std::string& message)
void Notification::setCreatedAt(const util::Timestamp& createdAt)
{
m_createdAt = createdAt;
+}
+
+std::string Notification::serialize() const
+{
+ std::ostringstream serializedNotification;
+ serializedNotification << m_id << ','
+ << m_recipientUserId << ','
+ << m_title << ','
+ << m_message << ','
+ << m_createdAt.toString();
+ return serializedNotification.str();
+}
+
+Notification* Notification::deserialize(const std::string& record)
+{
+ std::string id, recipientUserId, title, message, createdAtTimestampString;
+ std::istringstream serializedNotification(record);
+ getline(serializedNotification, id, ',');
+ getline(serializedNotification, recipientUserId, ',');
+ getline(serializedNotification, title, ',');
+ getline(serializedNotification, message, ',');
+ getline(serializedNotification, createdAtTimestampString, ',');
+ util::Timestamp createdAtTimestamp;
+ try
+ {
+ createdAtTimestamp = util::Timestamp::fromString(createdAtTimestampString);
+ }
+ catch (...)
+ {
+ throw std::runtime_error("Invalid createdAt timestamp");
+ }
+ return Factory::getObject(
+ id,
+ recipientUserId,
+ title,
+ message,
+ createdAtTimestamp
+ );
+}
+
+std::string Notification::getHeaders()
+{
+ return "ID,RecipientID,Title,Message,Timestamp";
}
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h
index f86499e..fc03386 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h
@@ -17,6 +17,7 @@ private:
public:
Notification();
Notification(const std::string& recipientUserId, User* recipient, const std::string& title, const std::string& message, const util::Timestamp& createdAt);
+ Notification(const std::string& id, const std::string& recipientUserId, const std::string& title, const std::string& message, const util::Timestamp& createdAt);
const std::string& getId() const;
const std::string& getRecipientUserId() const;
User* getRecipient() const;
@@ -29,4 +30,7 @@ public:
void setTitle(const std::string& title);
void setMessage(const std::string& message);
void setCreatedAt(const util::Timestamp& createdAt);
+ std::string serialize() const;
+ static Notification* deserialize(const std::string&);
+ static std::string getHeaders();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp
index fa7f509..e83b639 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp
@@ -1,4 +1,8 @@
+#include
#include "Service.h"
+#include "InventoryItem.h"
+#include "StringHelper.h"
+#include "Factory.h"
int Service::m_uid = 0;
@@ -12,7 +16,29 @@ Service::Service(const std::string& name, const util::MapgetId());
+ }
+}
+
+Service::Service(const std::string& id, const std::string& name, const util::Vector& requiredInventoryItemIDs, double laborCost, util::State status)
+ : m_id(id),
+ m_name(name),
+ m_requiredInventoryItemIDs(requiredInventoryItemIDs),
+ m_status(status),
+ m_laborCost(laborCost)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
const std::string& Service::getId() const
{
@@ -24,6 +50,11 @@ const std::string& Service::getName() const
return m_name;
}
+const util::Vector& Service::getRequiredInventoryItemIDs() const
+{
+ return m_requiredInventoryItemIDs;
+}
+
const util::Map& Service::getRequiredInventoryItems() const
{
return m_requiredInventoryItems;
@@ -52,6 +83,13 @@ void Service::setName(const std::string& name)
void Service::setRequiredInventoryItems(const util::Map& requiredInventoryItems)
{
m_requiredInventoryItems = requiredInventoryItems;
+ m_requiredInventoryItemIDs.clear();
+ int numberOfRequiredInventoryItems = m_requiredInventoryItems.getSize();
+ auto inventoryItemPointers = m_requiredInventoryItems.getValues();
+ for (int index = 0; index < numberOfRequiredInventoryItems; index++)
+ {
+ m_requiredInventoryItemIDs.push_back(inventoryItemPointers[index]->getId());
+ }
}
void Service::setLaborCost(double laborCost)
@@ -62,4 +100,77 @@ void Service::setLaborCost(double laborCost)
void Service::setState(util::State status)
{
m_status = status;
+}
+
+static std::string getInventoryItemIDsAsString(const util::Vector& inventoryItemIds)
+{
+ int numberOfInventoryItems = inventoryItemIds.getSize();
+ std::string inventoryItemIDs;
+ for (int index = 0; index < numberOfInventoryItems; index++)
+ {
+ inventoryItemIDs += inventoryItemIds[index];
+ if (index < numberOfInventoryItems - 1)
+ {
+ inventoryItemIDs += '|';
+ }
+ }
+ return inventoryItemIDs;
+}
+
+static util::Vector getInventoryItemIDsAsVector(const std::string& inventoryItemIDsString)
+{
+ util::Vector inventoryItemIDs;
+ std::string inventoryItemID;
+ std::istringstream serializedInventoryItemIDs(inventoryItemIDsString);
+ while (getline(serializedInventoryItemIDs, inventoryItemID, '|'))
+ {
+ inventoryItemIDs.push_back(inventoryItemID);
+ }
+ return inventoryItemIDs;
+}
+
+std::string Service::serialize() const
+{
+ std::ostringstream serializedService;
+ serializedService << m_id << ','
+ << m_name << ','
+ << getInventoryItemIDsAsString(m_requiredInventoryItemIDs) << ','
+ << m_laborCost << ','
+ << util::getStateString(m_status);
+ return serializedService.str();
+}
+
+Service* Service::deserialize(const std::string& record)
+{
+ std::string id, name;
+ std::string inventoryItemIDsString, laborCostString, statusString;
+ double laborCost;
+ std::istringstream serializedService(record);
+ getline(serializedService, id, ',');
+ getline(serializedService, name, ',');
+ getline(serializedService, inventoryItemIDsString, ',');
+ getline(serializedService, laborCostString, ',');
+ getline(serializedService, statusString, ',');
+ util::Vector inventoryItemIDs = getInventoryItemIDsAsVector(inventoryItemIDsString);
+ try
+ {
+ laborCost = std::stod(laborCostString);
+ }
+ catch (...)
+ {
+ throw std::runtime_error("Invalid labor cost");
+ }
+ util::State status = util::getState(statusString);
+ return Factory::getObject(
+ id,
+ name,
+ inventoryItemIDs,
+ laborCost,
+ status
+ );
+}
+
+std::string Service::getHeaders()
+{
+ return "ID,Name,InventoryIDs,LaborCost,Status";
}
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h
index b0d3175..ec00164 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "Map.h"
+#include "Vector.h"
#include "Enums.h"
class InventoryItem;
@@ -11,14 +12,17 @@ private:
static int m_uid;
std::string m_id;
std::string m_name;
+ util::Vector m_requiredInventoryItemIDs;
util::Map m_requiredInventoryItems;
double m_laborCost;
util::State m_status;
public:
Service();
Service(const std::string& name, const util::Map& requiredInventoryItems, double laborCost);
+ Service(const std::string& id, const std::string& name, const util::Vector& requiredInventoryItemIDs, double laborCost, util::State state);
const std::string& getId() const;
const std::string& getName() const;
+ const util::Vector& getRequiredInventoryItemIDs() const;
const util::Map& getRequiredInventoryItems() const;
double getLaborCost() const;
util::State getState() const;
@@ -27,4 +31,7 @@ public:
void setRequiredInventoryItems(const util::Map& requiredInventoryItems);
void setLaborCost(double laborCost);
void setState(util::State status);
+ std::string serialize() const;
+ static Service* deserialize(const std::string&);
+ static std::string getHeaders();
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp
index 1fdfaf0..efd6c6a 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.cpp
@@ -1,14 +1,20 @@
+#include
+#include
#include "ServiceBooking.h"
+#include "Service.h"
+#include "Enums.h"
+#include "Factory.h"
+#include "StringHelper.h"
int ServiceBooking::m_uid = 0;
ServiceBooking::ServiceBooking()
: m_id("SRV" + std::to_string(++m_uid)),
m_customer(nullptr),
+ m_assignedTechnician(nullptr),
m_discountPercentage(0.0) {}
ServiceBooking::ServiceBooking(
- const std::string& id,
util::ServiceJobStatus status,
const util::Map& services,
@@ -18,7 +24,7 @@ ServiceBooking::ServiceBooking(
const std::string& vehicleBrand,
const std::string& vehicleModel,
const std::string& assignedTechnicianId,
- const std::string& assignedTechnician,
+ User* assignedTechnician,
double discountPercentage
)
: m_id("SRV" + std::to_string(++m_uid)),
@@ -33,6 +39,42 @@ ServiceBooking::ServiceBooking(
m_assignedTechnician(assignedTechnician),
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
@@ -45,6 +87,11 @@ util::ServiceJobStatus ServiceBooking::getStatus() const
return m_status;
}
+const util::Vector& ServiceBooking::getServiceIDs() const
+{
+ return m_serviceIDs;
+}
+
const util::Map& ServiceBooking::getServices() const
{
return m_services;
@@ -80,7 +127,7 @@ const std::string& ServiceBooking::getAssignedTechnicianId() const
return m_assignedTechnicianId;
}
-const std::string& ServiceBooking::getAssignedTechnician() const
+const User* ServiceBooking::getAssignedTechnician() const
{
return m_assignedTechnician;
}
@@ -103,6 +150,13 @@ void ServiceBooking::setStatus(const util::ServiceJobStatus& status)
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());
+ }
}
void ServiceBooking::setCustomerId(const std::string& customerId)
@@ -135,7 +189,7 @@ void ServiceBooking::setAssignedTechnicianId(const std::string& assignedTechnici
m_assignedTechnicianId = assignedTechnicianId;
}
-void ServiceBooking::setAssignedTechnician(const std::string& assignedTechnician)
+void ServiceBooking::setAssignedTechnician(User* assignedTechnician)
{
m_assignedTechnician = assignedTechnician;
}
@@ -143,4 +197,89 @@ void ServiceBooking::setAssignedTechnician(const std::string& assignedTechnician
void ServiceBooking::setDiscountPercentage(double discountPercentage)
{
m_discountPercentage = discountPercentage;
-}
\ No newline at end of file
+}
+
+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";
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h
index 5ecc1b0..896360d 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/ServiceBooking.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "Map.h"
+#include "Vector.h"
#include "Enums.h"
class Service;
@@ -12,6 +13,7 @@ private:
static int m_uid;
std::string m_id;
util::ServiceJobStatus m_status;
+ util::Vector m_serviceIDs;
util::Map m_services;
std::string m_customerId;
User* m_customer;
@@ -19,12 +21,11 @@ private:
std::string m_vehicleBrand;
std::string m_vehicleModel;
std::string m_assignedTechnicianId;
- std::string m_assignedTechnician;
+ User* m_assignedTechnician;
double m_discountPercentage;
public:
ServiceBooking();
ServiceBooking(
- const std::string& id,
util::ServiceJobStatus status,
const util::Map& services,
@@ -34,11 +35,23 @@ public:
const std::string& vehicleBrand,
const std::string& vehicleModel,
const std::string& assignedTechnicianId,
- const std::string& assignedTechnician,
+ User* assignedTechnician,
+ double discountPercentage
+ );
+ 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
);
const std::string& getId() const;
util::ServiceJobStatus getStatus() const;
+ const util::Vector& getServiceIDs() const;
const util::Map& getServices() const;
const std::string& getCustomerId() const;
User* getCustomer() const;
@@ -46,7 +59,7 @@ public:
const std::string& getVehicleBrand() const;
const std::string& getVehicleModel() const;
const std::string& getAssignedTechnicianId() const;
- const std::string& getAssignedTechnician() const;
+ const User* getAssignedTechnician() const;
double getDiscountPercentage() const;
void setId(const std::string& id);
void setStatus(const util::ServiceJobStatus& status);
@@ -57,6 +70,9 @@ public:
void setVehicleBrand(const std::string& vehicleBrand);
void setVehicleModel(const std::string& vehicleModel);
void setAssignedTechnicianId(const std::string& assignedTechnicianId);
- void setAssignedTechnician(const std::string& assignedTechnician);
+ void setAssignedTechnician(User* assignedTechnician);
void setDiscountPercentage(double discountPercentage);
+ std::string serialize() const;
+ static ServiceBooking* deserialize(const std::string&);
+ static std::string getHeaders();
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp
index 52d85a9..7bea5f0 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp
@@ -1,6 +1,9 @@
+#include
#include "User.h"
#include "Notification.h"
#include "Enums.h"
+#include "Factory.h"
+#include "StringHelper.h"
int User::m_uid = 0;
@@ -19,11 +22,29 @@ User::User(const std::string& userName, const std::string& password, const std::
m_type(role),
m_status(util::State::ACTIVE) {}
+User::User(const std::string& userId, const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role, util::State status)
+ : m_id(userId),
+ m_userName(userName),
+ m_password(password),
+ m_name(name),
+ m_phone(phone),
+ m_email(email),
+ m_type(role),
+ m_status(status)
+{
+ int idNumber = util::extractNumber(m_id);
+ if (idNumber > m_uid)
+ {
+ m_uid = idNumber;
+ }
+}
+
User::~User()
{
- for (int index = 0; index < m_notifications.getSize(); index++)
+ auto values = m_notifications.getValues();
+ for (int index = 0; index < values.getSize(); index++)
{
- delete m_notifications.getValues()[index];
+ delete values[index];
}
}
@@ -120,3 +141,48 @@ void User::setState(util::State status)
void User::update(Notification* notification)
{
}
+
+std::string User::serialize() const
+{
+ std::ostringstream serializedUser;
+ serializedUser << m_id << ','
+ << m_userName << ','
+ << m_password << ','
+ << m_name << ','
+ << m_phone << ','
+ << m_email << ','
+ << util::getUserTypeString(m_type) << ','
+ << util::getStateString(m_status);
+ return serializedUser.str();
+}
+
+User* User::deserialize(const std::string& record)
+{
+ std::string id, name, username, phone, password, email;
+ std::string userTypeString, stateString;
+ std::istringstream serializedUser(record);
+ getline(serializedUser, id, ',');
+ getline(serializedUser, username, ',');
+ getline(serializedUser, password, ',');
+ getline(serializedUser, name, ',');
+ getline(serializedUser, phone, ',');
+ getline(serializedUser, email, ',');
+ getline(serializedUser, userTypeString, ',');
+ getline(serializedUser, stateString);
+ util::UserType userType = util::getUserType(userTypeString);
+ util::State status = util::getState(stateString);
+ return Factory::getObject(id,
+ username,
+ password,
+ name,
+ phone,
+ email,
+ userType,
+ status);
+}
+
+std::string User::getHeaders()
+{
+ return "ID,Username,Password,Name,Phone,Email,UserType,UserStatus";
+}
+
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h
index bde21e1..efe4374 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h
@@ -22,6 +22,7 @@ private:
public:
User();
User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role);
+ User(const std::string& userId, const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role, util::State status);
~User();
const std::string& getId() const;
const std::string& getUserName() const;
@@ -42,4 +43,7 @@ public:
void setRole(util::UserType role);
void setState(util::State status);
void update(Notification* notification) override;
+ std::string serialize() const;
+ static User* deserialize(const std::string&);
+ static std::string getHeaders();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp
index 39ef719..9aa5166 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp
@@ -1 +1,49 @@
#include "InventoryManagementService.h"
+#include "FileManager.h"
+#include "InventoryItem.h"
+#include "Utility.h"
+#include "Config.h"
+
+util::Vector InventoryManagementService::getObserverIDs()
+{
+ util::Vector observerIDs;
+ int numberOfObservers = m_observers.getSize();
+ for (int index = 0; index < numberOfObservers; index++)
+ {
+ User* observer = m_observers.getValueAt(index);
+ if (observer)
+ {
+ observerIDs.push_back(observer->getId());
+ }
+ }
+ return observerIDs;
+}
+
+void InventoryManagementService::loadInventoryItems()
+{
+ util::FileManager inventoryItemFileManager(config::file::INVENTORYITEM_FILE);
+ auto& inventoryItems = m_dataStore.getInventoryItems();
+ auto inventoryItemsMap = inventoryItemFileManager.load();
+ int numberOfInventoryItems = inventoryItemsMap.getSize();
+ for (int index = 0; index < numberOfInventoryItems; index++)
+ {
+ inventoryItems[inventoryItemsMap.getKeyAt(index)] = inventoryItemsMap.getValueAt(index);
+ }
+}
+
+void InventoryManagementService::saveInventoryItems()
+{
+ util::FileManager inventoryItemFileManager(config::file::INVENTORYITEM_FILE);
+ auto& inventoryItems = m_dataStore.getInventoryItems();
+ inventoryItemFileManager.save(inventoryItems);
+}
+
+void InventoryManagementService::loadObservers()
+{
+ util::loadObservers(config::file::INVENTORYMANAGEMENTOBSERVERS, this, m_dataStore);
+}
+
+void InventoryManagementService::saveObservers()
+{
+ util::saveObservers(config::file::INVENTORYMANAGEMENTOBSERVERS, this);
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h
index 099b964..4473c7d 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "Map.h"
+#include "Vector.h"
#include "NotificationManagementService.h"
#include "DataStore.h"
@@ -11,6 +12,7 @@ class InventoryManagementService : public NotificationManagementService
private:
DataStore& m_dataStore;
static util::Map m_observers;
+ util::Vector getObserverIDs() override;
public:
InventoryManagementService() : m_dataStore(DataStore::getInstance()) {}
util::Map getInventoryItems();
@@ -21,4 +23,8 @@ public:
void sendNotification(User* user, const std::string& title, const std::string& message) override;
void attach(User* user) override;
void detach(User* user) override;
+ void loadInventoryItems();
+ void saveInventoryItems();
+ void loadObservers();
+ void saveObservers();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h
index b193b1d..096782a 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.h
@@ -10,4 +10,5 @@ public:
virtual void sendNotification(User* recipient, const std::string& title, const std::string& message) = 0;
virtual void attach(User* user) = 0;
virtual void detach(User* user) = 0;
+ virtual util::Vector getObserverIDs() = 0;
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp
index 786ebcf..055b57c 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp
@@ -1 +1,71 @@
+#include
#include "PaymentManagementService.h"
+#include "Invoice.h"
+#include "FileManager.h"
+#include "Utility.h"
+#include "Config.h"
+
+util::Vector PaymentManagementService::getObserverIDs()
+{
+ util::Vector observerIDs;
+ int numberOfObservers = m_observers.getSize();
+ for (int index = 0; index < numberOfObservers; index++)
+ {
+ User* observer = m_observers.getValueAt(index);
+ if (observer)
+ {
+ observerIDs.push_back(observer->getId());
+ }
+ }
+ return observerIDs;
+}
+
+void PaymentManagementService::loadInvoices()
+{
+ util::FileManager invoiceFileManager(config::file::INVOICE_FILE);
+ auto& invoices = m_dataStore.getInvoices();
+ auto& serviceBookings = m_dataStore.getServiceBookings();
+ auto& inventoryItems = m_dataStore.getInventoryItems();
+ auto invoicesMap = invoiceFileManager.load();
+ for (int invoiceIndex = 0; invoiceIndex < invoicesMap.getSize(); invoiceIndex++)
+ {
+ Invoice* invoice = invoicesMap.getValueAt(invoiceIndex);
+ int bookingIndex = serviceBookings.find(invoice->getBookingId());
+ if (bookingIndex == -1)
+ {
+ throw std::runtime_error("Invalid Booking ID");
+ }
+ ServiceBooking* booking = serviceBookings.getValueAt(bookingIndex);
+ invoice->setBooking(booking);
+ util::Map invoiceParts;
+ auto& partIDs = invoice->getPartIDs();
+ for (int partIndex = 0; partIndex < partIDs.getSize(); partIndex++)
+ {
+ const std::string& partID = partIDs[partIndex];
+ int inventoryIndex = inventoryItems.find(partID);
+ if (inventoryIndex == -1)
+ {
+ throw std::runtime_error("Invalid Part ID");
+ }
+ invoiceParts[partID] = inventoryItems.getValueAt(inventoryIndex);
+ }
+ invoice->setParts(invoiceParts);
+ invoices[invoice->getId()] = invoice;
+ }
+}
+void PaymentManagementService::saveInvoices()
+{
+ util::FileManager invoiceFileManager(config::file::INVOICE_FILE);
+ auto& invoices = m_dataStore.getInvoices();
+ invoiceFileManager.save(invoices);
+}
+
+void PaymentManagementService::loadObservers()
+{
+ util::loadObservers(config::file::PAYMENTMANAGEMENTOBSERVERS, this, m_dataStore);
+}
+
+void PaymentManagementService::saveObservers()
+{
+ util::saveObservers(config::file::PAYMENTMANAGEMENTOBSERVERS, this);
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h
index 56a2fd2..6fb94fc 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.h
@@ -13,6 +13,7 @@ class PaymentManagementService : public NotificationManagementService
private:
DataStore& m_dataStore;
static util::Map m_observers;
+ util::Vector getObserverIDs() override;
public:
PaymentManagementService() : m_dataStore(DataStore::getInstance()) {}
void generateInvoice(ServiceBooking* booking);
@@ -22,4 +23,8 @@ public:
void sendNotification(User* user, const std::string& title, const std::string& message) override;
void attach(User* user) override;
void detach(User* user) override;
+ void loadInvoices();
+ void saveInvoices();
+ void loadObservers();
+ void saveObservers();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
index 156c12b..eeb3e65 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
@@ -1 +1,211 @@
+#include
#include "ServiceManagementService.h"
+#include "FileManager.h"
+#include "Service.h"
+#include "ComboPackage.h"
+#include "ServiceBooking.h"
+#include "JobCard.h"
+#include "Config.h"
+#include "Utility.h"
+
+util::Vector ServiceManagementService::getObserverIDs()
+{
+ util::Vector observerIDs;
+ int numberOfObservers = m_observers.getSize();
+ for (int index = 0; index < numberOfObservers; index++)
+ {
+ User* observer = m_observers.getValueAt(index);
+ if (observer)
+ {
+ observerIDs.push_back(observer->getId());
+ }
+ }
+ return observerIDs;
+}
+
+void ServiceManagementService::loadServices()
+{
+ util::FileManager serviceFileManager(config::file::SERVICE_FILE);
+ auto& services = m_dataStore.getServices();
+ auto& inventoryItems = m_dataStore.getInventoryItems();
+ auto servicesMap = serviceFileManager.load();
+ for (int serviceIndex = 0; serviceIndex < servicesMap.getSize(); serviceIndex++)
+ {
+ Service* service = servicesMap.getValueAt(serviceIndex);
+ services[service->getId()] = service;
+ util::Map inventoryItemsMap;
+ auto& inventoryItemIDs = service->getRequiredInventoryItemIDs();
+ for (int inventoryItemIndex = 0; inventoryItemIndex < inventoryItemIDs.getSize(); inventoryItemIndex++)
+ {
+ const std::string& inventoryItemID = inventoryItemIDs[inventoryItemIndex];
+ int index = inventoryItems.find(inventoryItemID);
+ if (index == -1)
+ {
+ throw std::runtime_error("Invalid Inventory Item ID");
+ }
+ inventoryItemsMap[inventoryItemID] = inventoryItems.getValueAt(index);
+ }
+ service->setRequiredInventoryItems(inventoryItemsMap);
+ }
+}
+
+void ServiceManagementService::saveServices()
+{
+ util::FileManager serviceFileManager(config::file::SERVICE_FILE);
+ auto& services = m_dataStore.getServices();
+ serviceFileManager.save(services);
+}
+
+void ServiceManagementService::loadComboPackages()
+{
+ util::FileManager comboPackageFileManager(config::file::COMBOPACKAGE_FILE);
+ auto& comboPackages = m_dataStore.getComboPackages();
+ auto& services = m_dataStore.getServices();
+ auto comboPackagesMap = comboPackageFileManager.load();
+ for (int packageIndex = 0; packageIndex < comboPackagesMap.getSize(); packageIndex++)
+ {
+ ComboPackage* comboPackage = comboPackagesMap.getValueAt(packageIndex);
+ util::Map packageServices;
+ auto& serviceIDs = comboPackage->getServiceIDs();
+ for (int serviceIndex = 0; serviceIndex < serviceIDs.getSize(); serviceIndex++)
+ {
+ const std::string& serviceID = serviceIDs[serviceIndex];
+ int serviceMapIndex = services.find(serviceID);
+ if (serviceMapIndex == -1)
+ {
+ throw std::runtime_error("Invalid Service ID");
+ }
+ packageServices[serviceID] = services.getValueAt(serviceMapIndex);
+ }
+ comboPackage->setServices(packageServices);
+ comboPackages[comboPackage->getId()] = comboPackage;
+ }
+}
+
+void ServiceManagementService::saveComboPackages()
+{
+ util::FileManager comboPackageFileManager(config::file::COMBOPACKAGE_FILE);
+ auto& comboPackages = m_dataStore.getComboPackages();
+ comboPackageFileManager.save(comboPackages);
+}
+
+void ServiceManagementService::loadServiceBookings()
+{
+ util::FileManager bookingFileManager(config::file::SERVICEBOOKING_FILE);
+ auto& serviceBookings = m_dataStore.getServiceBookings();
+ auto& services = m_dataStore.getServices();
+ auto& users = m_dataStore.getUsers();
+ auto bookingsMap = bookingFileManager.load();
+ for (int bookingIndex = 0; bookingIndex < bookingsMap.getSize(); bookingIndex++)
+ {
+ ServiceBooking* booking = bookingsMap.getValueAt(bookingIndex);
+ util::Map bookingServices;
+ auto& serviceIDs = booking->getServiceIDs();
+ for (int serviceIndex = 0; serviceIndex < serviceIDs.getSize(); serviceIndex++)
+ {
+ const std::string& serviceID = serviceIDs[serviceIndex];
+ int serviceMapIndex = services.find(serviceID);
+ if (serviceMapIndex == -1)
+ {
+ throw std::runtime_error("Invalid Service ID");
+ }
+
+ bookingServices[serviceID] = services.getValueAt(serviceMapIndex);
+ }
+ booking->setServices(bookingServices);
+ int customerIndex = users.find(booking->getCustomerId());
+ if (customerIndex == -1)
+ {
+ throw std::runtime_error("Invalid Customer ID");
+ }
+ User* customer = users.getValueAt(customerIndex);
+ if (customer->getUserType() != util::UserType::CUSTOMER)
+ {
+ throw std::runtime_error("User is not a customer");
+ }
+ booking->setCustomer(customer);
+ const std::string& technicianId = booking->getAssignedTechnicianId();
+ if (!technicianId.empty())
+ {
+ int technicianIndex = users.find(technicianId);
+ if (technicianIndex == -1)
+ {
+ throw std::runtime_error("Invalid Technician ID");
+ }
+ User* technician = users.getValueAt(technicianIndex);
+ if (technician->getUserType() != util::UserType::TECHNICIAN)
+ {
+ throw std::runtime_error("User is not a technician");
+ }
+ booking->setAssignedTechnician(technician);
+ }
+ serviceBookings[booking->getId()] = booking;
+ }
+}
+
+void ServiceManagementService::saveServiceBookings()
+{
+ util::FileManager bookingFileManager(config::file::SERVICEBOOKING_FILE);
+ auto& serviceBookings = m_dataStore.getServiceBookings();
+ bookingFileManager.save(serviceBookings);
+}
+
+void ServiceManagementService::loadJobCards()
+{
+ util::FileManager jobCardFileManager(config::file::JOBCARD_FILE);
+ auto& jobCards = m_dataStore.getJobCards();
+ auto& serviceBookings = m_dataStore.getServiceBookings();
+ auto& services = m_dataStore.getServices();
+ auto& users = m_dataStore.getUsers();
+ auto jobCardsMap = jobCardFileManager.load();
+ for (int jobCardIndex = 0; jobCardIndex < jobCardsMap.getSize(); jobCardIndex++)
+ {
+ JobCard* jobCard = jobCardsMap.getValueAt(jobCardIndex);
+ int bookingIndex = serviceBookings.find(jobCard->getBookingId());
+ if (bookingIndex == -1)
+ {
+ throw std::runtime_error("Invalid Booking ID");
+ }
+ ServiceBooking* booking = serviceBookings.getValueAt(bookingIndex);
+ jobCard->setBooking(booking);
+ int serviceIndex = services.find(jobCard->getServiceId());
+ if (serviceIndex == -1)
+ {
+ throw std::runtime_error("Invalid Service ID");
+ }
+ Service* service = services.getValueAt(serviceIndex);
+ if (booking->getServices().find(jobCard->getServiceId()) == -1)
+ {
+ throw std::runtime_error("Service does not belong to booking");
+ }
+ jobCard->setService(service);
+ int technicianIndex = users.find(jobCard->getTechnicianId());
+ if (technicianIndex == -1)
+ {
+ throw std::runtime_error("Invalid Technician ID");
+ }
+ User* technician = users.getValueAt(technicianIndex);
+ if (technician->getUserType() != util::UserType::TECHNICIAN)
+ {
+ throw std::runtime_error("User is not a technician");
+ }
+ jobCard->setTechnician(technician);
+ jobCards[jobCard->getId()] = jobCard;
+ }
+}
+void ServiceManagementService::saveJobCards()
+{
+ util::FileManager jobCardFileManager(config::file::JOBCARD_FILE);
+ auto& jobCards = m_dataStore.getJobCards();
+ jobCardFileManager.save(jobCards);
+}
+
+void ServiceManagementService::loadObservers()
+{
+ util::loadObservers(config::file::SERVICEMANAGEMENTOBSERVERS, this, m_dataStore);
+}
+
+void ServiceManagementService::saveObservers()
+{
+ util::saveObservers(config::file::SERVICEMANAGEMENTOBSERVERS, this);
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h
index 85e05ed..b4bc99a 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h
@@ -14,6 +14,7 @@ class ServiceManagementService : public NotificationManagementService
private:
DataStore& m_dataStore;
static util::Map m_observers;
+ util::Vector getObserverIDs() override;
public:
ServiceManagementService() : m_dataStore(DataStore::getInstance()) {}
util::Map getServices();
@@ -34,4 +35,14 @@ public:
void sendNotification(User* user, const std::string& title, const std::string& message) override;
void attach(User* user) override;
void detach(User* user) override;
+ void loadServices();
+ void saveServices();
+ void loadComboPackages();
+ void saveComboPackages();
+ void loadServiceBookings();
+ void saveServiceBookings();
+ void loadJobCards();
+ void saveJobCards();
+ void loadObservers();
+ void saveObservers();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
index 2a5bd9e..8731484 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
@@ -1 +1,52 @@
#include "UserManagementService.h"
+#include "FileManager.h"
+#include "User.h"
+#include "Notification.h"
+#include "Config.h"
+
+void UserManagementService::loadUsers()
+{
+ util::FileManager userFileManager(config::file::USER_FILE);
+ util::FileManager notificationFileManager(config::file::NOTIFICATION_FILE);
+ auto& users = m_dataStore.getUsers();
+ auto usersMap = userFileManager.load();
+ auto notificationsMap = notificationFileManager.load();
+ int numberOfUsers = usersMap.getSize();
+ int numberOfNotifications = notificationsMap.getSize();
+ for (int index = 0; index < numberOfUsers; index++)
+ {
+ users[usersMap.getKeyAt(index)] = usersMap.getValueAt(index);
+ }
+ for (int index = 0; index < numberOfNotifications; index++)
+ {
+ Notification* notification = notificationsMap.getValueAt(index);
+ const std::string& recipientUserId = notification->getRecipientUserId();
+ int userIndex = users.find(recipientUserId);
+ if (userIndex == -1)
+ {
+ throw std::runtime_error("Invalid recipient user ID");
+ }
+ User* user = users.getValueAt(userIndex);
+ user->addNotification(notification);
+ }
+}
+
+void UserManagementService::saveUsers()
+{
+ util::FileManager userFileManager(config::file::USER_FILE);
+ util::FileManager notificationFileManager(config::file::NOTIFICATION_FILE);
+ auto& users = m_dataStore.getUsers();
+ util::Map notifications;
+ for (int userIndex = 0; userIndex < users.getSize(); userIndex++)
+ {
+ User* user = users.getValueAt(userIndex);
+ auto& userNotifications = user->getNotifications();
+ for (int notificationIndex = 0; notificationIndex < userNotifications.getSize(); notificationIndex++)
+ {
+ notifications[userNotifications.getKeyAt(notificationIndex)] =
+ userNotifications.getValueAt(notificationIndex);
+ }
+ }
+ userFileManager.save(users);
+ notificationFileManager.save(notifications);
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h
index bb7a85a..6bd6488 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.h
@@ -21,4 +21,6 @@ public:
void removeUser(const std::string& userID);
util::Vector getUserNotifications(const std::string& userID);
void deleteNotification(const std::string& notificationID, const std::string& userID);
+ void loadUsers();
+ void saveUsers();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h
new file mode 100644
index 0000000..751ec31
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h
@@ -0,0 +1,19 @@
+#pragma once
+
+namespace config
+{
+ namespace file
+ {
+ constexpr const char* INVENTORYITEM_FILE = "files/InventoryItem.csv";
+ constexpr const char* USER_FILE = "files/User.csv";
+ constexpr const char* NOTIFICATION_FILE = "files/Notification.csv";
+ constexpr const char* SERVICE_FILE = "files/Service.csv";
+ constexpr const char* COMBOPACKAGE_FILE = "files/ComboPackage.csv";
+ constexpr const char* SERVICEBOOKING_FILE = "files/ServiceBooking.csv";
+ constexpr const char* JOBCARD_FILE = "files/JobCard.csv";
+ constexpr const char* INVOICE_FILE = "files/Invoice.csv";
+ constexpr const char* SERVICEMANAGEMENTOBSERVERS = "files/ServiceManagementObservers.csv";
+ constexpr const char* PAYMENTMANAGEMENTOBSERVERS = "files/PaymentManagementObservers.csv";
+ constexpr const char* INVENTORYMANAGEMENTOBSERVERS = "files/InventoryManagementObservers.csv";
+ }
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/FileHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/FileHelper.h
new file mode 100644
index 0000000..b9990b2
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/FileHelper.h
@@ -0,0 +1,47 @@
+#pragma once
+#include
+#include
+#include
+#include "Vector.h"
+
+namespace util
+{
+ inline util::Vector loadRecords(const std::string& filePath)
+ {
+ util::Vector records;
+ std::ifstream file(filePath);
+ if (!file.is_open())
+ {
+ std::ofstream newFile(filePath);
+ newFile.close();
+ file.open(filePath);
+ }
+ std::string line;
+ bool isHeader = true;
+ while (std::getline(file, line))
+ {
+ if (isHeader)
+ {
+ isHeader = false;
+ continue;
+ }
+ records.push_back(line);
+ }
+ return records;
+ }
+
+ inline void saveRecords(const std::string& filePath, const util::Vector& records)
+ {
+ std::ofstream file(filePath, std::ios::trunc);
+ if (!file.is_open())
+ {
+ throw std::runtime_error("Failed to open file " + filePath);
+ }
+ file << "Values" << '\n';
+ int numberOfRecords = records.getSize();
+ for (int index = 0; index < numberOfRecords; index++)
+ {
+ file << records[index] << '\n';
+ }
+ }
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/FileManager.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/FileManager.h
new file mode 100644
index 0000000..f3b0de5
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/FileManager.h
@@ -0,0 +1,82 @@
+#pragma once
+#include
+#include
+#include "Vector.h"
+#include "Map.h"
+
+namespace util
+{
+ template using objects = util::Map;
+
+ template
+ class FileManager
+ {
+ private:
+ std::string m_filePath;
+ public:
+ FileManager() : m_filePath("") {}
+ FileManager(const std::string& filePath) : m_filePath(filePath) {}
+ objects load();
+ void save(const objects&);
+ };
+
+ template
+ objects FileManager::load()
+ {
+ objects records;
+ std::ifstream file(m_filePath);
+ if (!file.is_open())
+ {
+ std::ofstream newFile(m_filePath);
+ newFile.close();
+ file.open(m_filePath);
+ }
+ util::Vector lines;
+ std::string line;
+ while (std::getline(file, line))
+ {
+ lines.push_back(line);
+ }
+ int numberOfLines = lines.getSize();
+ bool isHeader = true;
+ for (int lineIndex = 0; lineIndex < numberOfLines; lineIndex++)
+ {
+ const auto& record = lines[lineIndex];
+ if (isHeader)
+ {
+ isHeader = false;
+ continue;
+ }
+ auto object = T::deserialize(record);
+ if (!object)
+ {
+ throw std::runtime_error("Failed to deserialize record");
+ }
+ records[object->getId()] = object;
+ }
+ return records;
+ }
+
+ template
+ void FileManager::save(const objects& records)
+ {
+ util::Vector lines;
+ lines.push_back(T::getHeaders());
+ int numberOfRecords = records.getSize();
+ for (int recordIndex = 0; recordIndex < numberOfRecords; recordIndex++)
+ {
+ const auto& record = records.getValueAt(recordIndex);
+ lines.push_back(record->serialize());
+ }
+ std::ofstream file(m_filePath, std::ios::trunc);
+ if (!file.is_open())
+ {
+ throw std::runtime_error("Failed to open file " + m_filePath);
+ }
+ int numberOfLines = lines.getSize();
+ for (int lineIndex = 0; lineIndex < numberOfLines; lineIndex++)
+ {
+ file << lines[lineIndex] << '\n';
+ }
+ }
+}
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h
index d8fee08..e789442 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/InputHelper.h
@@ -34,7 +34,7 @@ namespace util
/*
* Function: read
- * Description: Reads a line of text input from console into a string.
+ * Description: Reads a line of text input from console into a string and cleans it up.
* Parameters:
* value - reference to a string where the input will be stored
* Returns:
@@ -43,6 +43,15 @@ namespace util
inline void read(std::string& value)
{
std::getline(std::cin >> std::ws, value);
+ std::string cleanedValue;
+ for (int index = 0; index < value.length(); index++)
+ {
+ if (value[index] != ',')
+ {
+ cleanedValue += value[index];
+ }
+ }
+ value = cleanedValue;
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/StringHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/StringHelper.h
new file mode 100644
index 0000000..64f657c
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/StringHelper.h
@@ -0,0 +1,18 @@
+#include
+#include
+
+namespace util
+{
+ inline int extractNumber(const std::string& input)
+ {
+ int result = 0;
+ for (char character : input)
+ {
+ if (std::isdigit(static_cast(character)))
+ {
+ result = result * 10 + (character - '0');
+ }
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h
new file mode 100644
index 0000000..f3a895f
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Utility.h
@@ -0,0 +1,29 @@
+#pragma once
+#include "NotificationManagementService.h"
+#include "FileHelper.h"
+#include "DataStore.h"
+
+namespace util
+{
+ inline void loadObservers(const std::string& filePath, NotificationManagementService* service, DataStore& dataStore)
+ {
+ auto observerIDs = util::loadRecords(filePath);
+ auto& users = dataStore.getUsers();
+ for (int index = 0; index < observerIDs.getSize(); index++)
+ {
+ const std::string& observerID = observerIDs[index];
+ int userIndex = users.find(observerID);
+ if (userIndex == -1)
+ {
+ throw std::runtime_error("Invalid Observer ID");
+ }
+ service->attach(users.getValueAt(userIndex));
+ }
+ }
+
+ inline void saveObservers(const std::string& filePath, NotificationManagementService* service)
+ {
+ auto observerIDs = service->getObserverIDs();
+ util::saveRecords(filePath, observerIDs);
+ }
+}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp
index 122f9a8..ddba515 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp
@@ -4,6 +4,7 @@
void UserInterface::run()
{
+ m_controller.loadSystemData();
bool isMenuActive = true;
while (isMenuActive)
{
@@ -24,6 +25,7 @@ void UserInterface::run()
util::pressEnter();
}
}
+ m_controller.saveSystemData();
}
bool UserInterface::handleOperation(int choice)