Fix Completing a Job Throws an Exception
Changes: - Refactored ServiceManagementService::updateJobStatus() to use tracked job card references instead of raw pointers, ensuring consistent state updates. - Added proper null checks and error handling for current job retrieval to prevent unexpected termination. - Updated logic to mark tracked job records as MODIFIED when status transitions occur (STARTED → IN_PROGRESS, IN_PROGRESS → COMPLETED). - Simplified control flow and indentation for better readability and maintainability. Fixes #2076
This commit is contained in:
@@ -220,6 +220,11 @@ void DataStore::refreshCache(util::Map<std::string, TrackedRecord<TObject>>& cac
|
|||||||
if (oldIndex != -1)
|
if (oldIndex != -1)
|
||||||
{
|
{
|
||||||
TrackedRecord<TObject>& oldRecord = oldCache.getValueAt(oldIndex);
|
TrackedRecord<TObject>& oldRecord = oldCache.getValueAt(oldIndex);
|
||||||
|
if (oldRecord.state == RecordState::MODIFIED)
|
||||||
|
{
|
||||||
|
cache.insert(id, oldRecord);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*oldRecord.data = *refreshedRecord.data;
|
*oldRecord.data = *refreshedRecord.data;
|
||||||
oldRecord.slotIndex = refreshedRecord.slotIndex;
|
oldRecord.slotIndex = refreshedRecord.slotIndex;
|
||||||
oldRecord.state = refreshedRecord.state;
|
oldRecord.state = refreshedRecord.state;
|
||||||
|
|||||||
+4
-4
@@ -883,7 +883,6 @@ void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
|||||||
AuthenticationManagementService authenticationManagementService;
|
AuthenticationManagementService authenticationManagementService;
|
||||||
PaymentManagementService paymentManagementService;
|
PaymentManagementService paymentManagementService;
|
||||||
bool jobStatusUpdated = false, serviceBookingCompleted;
|
bool jobStatusUpdated = false, serviceBookingCompleted;
|
||||||
JobCard* currentJob;
|
|
||||||
User* currentTechnician = authenticationManagementService.getAuthenticatedUser();
|
User* currentTechnician = authenticationManagementService.getAuthenticatedUser();
|
||||||
if (currentTechnician == nullptr)
|
if (currentTechnician == nullptr)
|
||||||
{
|
{
|
||||||
@@ -903,7 +902,8 @@ void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
|||||||
{
|
{
|
||||||
throw std::runtime_error("Unable to fetch current job.");
|
throw std::runtime_error("Unable to fetch current job.");
|
||||||
}
|
}
|
||||||
currentJob = currentAssignedJobs.getValueAt(currentAssignedJobs.find(jobID));
|
auto& trackedCurrentJob = trackedJobCards.getValueAt(jobIndex);
|
||||||
|
JobCard* currentJob = trackedCurrentJob.data;
|
||||||
if (currentJob == nullptr)
|
if (currentJob == nullptr)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Unable to fetch current job.");
|
throw std::runtime_error("Unable to fetch current job.");
|
||||||
@@ -911,13 +911,13 @@ void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
|||||||
if (currentJob->getStatus() == util::ServiceJobStatus::STARTED)
|
if (currentJob->getStatus() == util::ServiceJobStatus::STARTED)
|
||||||
{
|
{
|
||||||
currentJob->setStatus(util::ServiceJobStatus::IN_PROGRESS);
|
currentJob->setStatus(util::ServiceJobStatus::IN_PROGRESS);
|
||||||
trackedJobCards.getValueAt(jobIndex).state = RecordState::MODIFIED;
|
trackedCurrentJob.state = RecordState::MODIFIED;
|
||||||
jobStatusUpdated = true;
|
jobStatusUpdated = true;
|
||||||
}
|
}
|
||||||
else if (currentJob->getStatus() == util::ServiceJobStatus::IN_PROGRESS)
|
else if (currentJob->getStatus() == util::ServiceJobStatus::IN_PROGRESS)
|
||||||
{
|
{
|
||||||
currentJob->setStatus(util::ServiceJobStatus::COMPLETED);
|
currentJob->setStatus(util::ServiceJobStatus::COMPLETED);
|
||||||
trackedJobCards.getValueAt(jobIndex).state = RecordState::MODIFIED;
|
trackedCurrentJob.state = RecordState::MODIFIED;
|
||||||
jobStatusUpdated = true;
|
jobStatusUpdated = true;
|
||||||
serviceBookingCompleted = hasCompletedAllJobs(currentJob->getBookingId(), currentAssignedJobs);
|
serviceBookingCompleted = hasCompletedAllJobs(currentJob->getBookingId(), currentAssignedJobs);
|
||||||
if (serviceBookingCompleted)
|
if (serviceBookingCompleted)
|
||||||
|
|||||||
Reference in New Issue
Block a user