diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp index 3b674ed..d27635e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.cpp @@ -392,9 +392,9 @@ Parameters: Returns: - void */ -void Controller::completeJob(const std::string& jobID) +void Controller::updateJobStatus(const std::string& jobID) { - m_serviceManagementService.completeJob(jobID); + m_serviceManagementService.updateJobStatus(jobID); } /* diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h index e75ebd4..a0a70bc 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/controllers/Controller.h @@ -59,7 +59,7 @@ public: void createService(const std::string& name, const util::Vector& inventoryItemIDs, double laborCost); void removeService(const std::string& serviceID); util::Map getJobCardsByUser(); - void completeJob(const std::string& jobID); + void updateJobStatus(const std::string& jobID); void removeUser(const std::string& userID); void createComboPackage(const std::string& name, const util::Vector& serviceIDs, double discountPercentage); void removeComboPackage(const std::string& comboPackageID); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp index 5cd870b..f6d3905 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp @@ -1080,7 +1080,7 @@ static bool hasCompletedAllJobs(std::string bookingId, util::MapgetBookingId() == bookingId) { - if (currentJob->getStatus() == util::ServiceJobStatus::STARTED) + if (currentJob->getStatus() != util::ServiceJobStatus::COMPLETED && currentJob->getStatus() != util::ServiceJobStatus::CANCELLED) { return false; } @@ -1090,18 +1090,19 @@ static bool hasCompletedAllJobs(std::string bookingId, util::MapgetStatus() == util::ServiceJobStatus::STARTED) { - currentJob->setStatus(util::ServiceJobStatus::COMPLETED); + currentJob->setStatus(util::ServiceJobStatus::IN_PROGRESS); jobStatusUpdated = true; } + else if (currentJob->getStatus() == util::ServiceJobStatus::IN_PROGRESS) + { + currentJob->setStatus(util::ServiceJobStatus::COMPLETED); + jobStatusUpdated = true; + serviceBookingCompleted = hasCompletedAllJobs(currentJob->getBookingId(), currentAssignedJobs); + if (serviceBookingCompleted) + { + currentJob->getBooking()->setStatus(util::ServiceJobStatus::COMPLETED); + paymentManagementService.generateInvoice(currentJob->getBooking()); + std::string title = "Service Booking completed. Invoice Generated."; + std::string message = "Services completed for the booking and invoice generated."; + sendNotification(currentJob->getBooking()->getCustomer(), title, message); + } + } } else { - throw std::runtime_error("Failed to complete the job, some error occurred or job already completed."); + throw std::runtime_error("Failed to update job status. Job may already be completed."); } if (!jobStatusUpdated) { - throw std::runtime_error("Failed to complete the job, some error occurred or job already completed."); - } - - serviceBookingCompleted = hasCompletedAllJobs(currentJob->getBookingId(), currentAssignedJobs); - if (serviceBookingCompleted) - { - currentJob->getBooking()->setStatus(util::ServiceJobStatus::COMPLETED); - paymentManagementService.generateInvoice(currentJob->getBooking()); - std::string title = "Service Booking completed. Invoice Generated."; - std::string message = "Services completed for the booking and invoice generated."; - sendNotification(currentJob->getBooking()->getCustomer(), title, message); + throw std::runtime_error("Failed to update job status. Job may already be completed."); } } \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h index 2fdcc93..b2a4384 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h @@ -37,7 +37,7 @@ public: void createService(const std::string& name, const util::Vector& inventoryItemIDs, double laborCost); void removeService(const std::string& serviceID); util::Map getJobCards(const std::string& technicianID); - void completeJob(const std::string& jobID); + void updateJobStatus(const std::string& jobID); void cancelCustomerServiceBookings(const std::string& customerID); void cancelTechnicianJobs(const std::string& technicianID); void createComboPackage(const std::string& packageName, const util::Vector& serviceIDs, double discountPercentage); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h index 16490f1..c167b28 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h @@ -37,6 +37,7 @@ namespace util PENDING, STARTED, COMPLETED, + IN_PROGRESS, CANCELLED }; @@ -209,6 +210,8 @@ namespace util return "COMPLETED"; case ServiceJobStatus::CANCELLED: return "CANCELLED"; + case ServiceJobStatus::IN_PROGRESS: + return "IN_PROGRESS"; } throw std::invalid_argument("Invalid ServiceJobStatus"); } @@ -241,6 +244,10 @@ namespace util { return ServiceJobStatus::CANCELLED; } + if (value == "IN_PROGRESS") + { + return ServiceJobStatus::IN_PROGRESS; + } throw std::invalid_argument("Invalid ServiceJobStatus string"); } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h index f65c1f4..0a4136a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h @@ -627,7 +627,6 @@ inline void displayInvoices(util::Map currentUserIn std::cout << "Unable to fetch the selected invoice\n"; doRun = false; } - } while (doRun); } } @@ -646,7 +645,35 @@ inline util::Map filterStartedJobCards(util::MapgetStatus() == util::ServiceJobStatus::STARTED) + if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED || currentJobCard->getStatus() == util::ServiceJobStatus::IN_PROGRESS)) + { + startedJobCards.insert(currentJobCard->getId(), currentJobCard); + } + } + return startedJobCards; +} + +/* +Function: filterJobCards +Description: + Filters the given list of job cards and returns only those + whose status matches the specified ServiceJobStatus. +Parameters: + - assignedJobCards: util::Map& + Map of job card IDs to JobCard pointers assigned to the technician. + - selectedJobStatus: util::ServiceJobStatus + The status type to filter job cards by. +Returns: + - util::Map + A map containing only job cards with the specified status. +*/ +inline util::Map filterJobCards(util::Map& assignedJobCards, util::ServiceJobStatus selectedJobStatus) +{ + util::Map startedJobCards; + for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++) + { + const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator); + if (currentJobCard && currentJobCard->getStatus() == selectedJobStatus) { startedJobCards.insert(currentJobCard->getId(), currentJobCard); } @@ -675,16 +702,18 @@ inline void displayAllJobs(util::Map& assignedJobCa << std::setw(12) << "JobID" << std::setw(20) << "ServiceName" << std::setw(12) << "ServiceID" + << std::setw(12) << "Status" << std::endl; for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++) { const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator); - if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED)) + if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED || currentJobCard->getStatus() == util::ServiceJobStatus::IN_PROGRESS)) { std::cout << std::left << std::setw(12) << currentJobCard->getBookingId() << std::setw(12) << currentJobCard->getId() - << std::setw(20) << currentJobCard->getService()->getName() + << std::setw(20) << util::truncateString(currentJobCard->getService()->getName(), 15) << std::setw(12) << currentJobCard->getServiceId() + << std::setw(12) << util::getServiceJobStatusString(currentJobCard->getStatus()) << std::endl; } } @@ -698,16 +727,31 @@ Parameters: Returns: - std::string: ID of the selected job card, or empty string if none selected */ -inline std::string selectJobCardToComplete(util::Map& assignedJobCards) +inline std::string selectJobCardToUpdate(util::Map& assignedJobCards, util::ServiceJobStatus selectedJobStatusType) { util::Map incompleteJobCards; if (assignedJobCards.getSize() == 0) { - std::cout << "No started jobs available to complete.\n"; + std::cout << "No jobs available.\n\n"; return ""; } int currentIndex = 1; int choice; + if (selectedJobStatusType == util::ServiceJobStatus::STARTED) + { + util::clear(); + std::cout << "Select a job to update to Inprogress\n"; + } + else if (selectedJobStatusType == util::ServiceJobStatus::IN_PROGRESS) + { + util::clear(); + std::cout << "Select a job to update to Completed\n"; + } + else + { + std::cout << "Unable to update completed or pending jobs.\n\n"; + return ""; + } std::cout << std::endl; std::cout << std::left << std::setw(6) << "Index" @@ -715,22 +759,24 @@ inline std::string selectJobCardToComplete(util::MapgetStatus() == util::ServiceJobStatus::STARTED)) + if (currentJobCard && (currentJobCard->getStatus() == selectedJobStatusType)) { std::cout << std::left << std::setw(6) << currentIndex << std::setw(12) << currentJobCard->getBookingId() << std::setw(12) << currentJobCard->getId() - << std::setw(20) << currentJobCard->getService()->getName() + << std::setw(20) << util::truncateString(currentJobCard->getService()->getName(), 15) << std::setw(12) << currentJobCard->getServiceId() + << std::setw(12) << util::getServiceJobStatusString(currentJobCard->getStatus()) << std::endl; incompleteJobCards.insert(currentIndex++, currentJobCard); } } - std::cout << "Select the Job Card to complete (Index): "; + std::cout << "Select the Job Card to Update (Index): "; util::read(choice); int selectedJobCardIndex = incompleteJobCards.find(choice); if (selectedJobCardIndex != -1) @@ -741,7 +787,7 @@ inline std::string selectJobCardToComplete(util::Map assignedJobCards = m_controller.getJobCardsByUser(); - util::Map startedJobCards = filterStartedJobCards(assignedJobCards); - displayAllJobs(startedJobCards); + util::Map jobCards = filterStartedJobCards(assignedJobCards); + displayAllJobs(jobCards); util::pressEnter(); } /* -Function: completeJob -Description: Allows the technician to mark a selected job card as completed. +Function: updateJobStatus +Description: Allows the technician to update a selected job card. Validates selection and updates job status through the controller. Parameters: - None Returns: - void */ -void TechnicianMenu::completeJob() +void TechnicianMenu::updateJobStatus() { util::clear(); - std::cout << "Complete Job\n"; + std::cout << "Update Job Status\n"; + int choice; + std::string selectedJobID; + util::ServiceJobStatus selectedJobStatus = util::ServiceJobStatus::PENDING; util::Map assignedJobCards = m_controller.getJobCardsByUser(); - util::Map startedJobCards = filterStartedJobCards(assignedJobCards); - std::string selectedJobID = selectJobCardToComplete(startedJobCards); + std::cout << "Select the type of job you want to update\n1.Started\n2.Inprogress\nChoice: "; + util::read(choice); + if (choice == 1) + { + selectedJobStatus = util::ServiceJobStatus::STARTED; + } + else if (choice == 2) + { + selectedJobStatus = util::ServiceJobStatus::IN_PROGRESS; + } + else + { + std::cout << "Invalid choice. Please try again.\n"; + util::pressEnter(); + return; + } + util::Map selectedTypeJobCard = filterJobCards(assignedJobCards, selectedJobStatus); + selectedJobID = selectJobCardToUpdate(selectedTypeJobCard, selectedJobStatus); if (!selectedJobID.empty()) { - m_controller.completeJob(selectedJobID); - std::cout << "\nJob marked as completed.\n\n"; + m_controller.updateJobStatus(selectedJobID); + std::cout << "\nJob status updated.\n\n"; } util::pressEnter(); } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h index d0c5ca9..a17ccb1 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h @@ -18,7 +18,7 @@ private: public: void showMenu(); void displayJobs(); - void completeJob(); + void updateJobStatus(); void viewNotifications(); void logout(); void changePassword(); diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h index 501cfce..4a485de 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.h @@ -27,4 +27,4 @@ public: void run(); void login(); void registerCustomer(); -}; +}; \ No newline at end of file