Implement serialization/deserialization and persistent storage across services
- Add serialize/deserialize support for core models - Add file-based load/save functions in management services - Introduce FileManager, Config, Utility and helper utilities - Persist observer IDs for notification services - Resolve object relationships during load (services, bookings, invoices, job cards) - Add controller-level loadSystemData/saveSystemData - Load data at app startup and save on shutdown
This commit is contained in:
@@ -1,4 +1,9 @@
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#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<JobCard>(
|
||||
id,
|
||||
bookingId,
|
||||
serviceId,
|
||||
technicianId,
|
||||
assignedDate,
|
||||
status,
|
||||
completionDate
|
||||
);
|
||||
}
|
||||
|
||||
std::string JobCard::getHeaders()
|
||||
{
|
||||
return "ID,BookingID,ServiceID,TechnicianID,AssignedDate,Status,CompletionDate";
|
||||
}
|
||||
Reference in New Issue
Block a user