Fix Technician Menu Complete Job UI Issues

- Cleared console before displaying Complete Job screen
- Improved submenu header and formatting for clarity
- Prevented table headers from showing when no jobs exist
- Refined job completion flow with consistent messages

Fixes #1782
This commit is contained in:
Jissin Mathew
2026-05-27 11:25:39 +05:30
committed by Joel Thomas
parent fb50aeba47
commit 01596e825e
3 changed files with 62 additions and 43 deletions
@@ -26,7 +26,6 @@ Date:19-May-2026
#include "User.h"
#include "UserManagementService.h"
#include "Utility.h"
#include "ComboPackage.h"
/*
Function: purchaseService
@@ -488,6 +488,28 @@ inline void displayInvoices(util::Map<std::string, const Invoice*> currentUserIn
util::pressEnter();
}
/*
Function: filterStartedJobCards
Description: Filters the given list of job cards and returns only those with status STARTED.
Parameters:
- assignedJobCards: Map of job card IDs to JobCard pointers.
Returns:
- util::Map<std::string, const JobCard*> containing only job cards with status STARTED.
*/
inline util::Map<std::string, const JobCard*> filterStartedJobCards(util::Map<std::string, const JobCard*> assignedJobCards)
{
util::Map<std::string, const JobCard*> startedJobCards;
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
{
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
if (currentJobCard && currentJobCard->getStatus() == util::ServiceJobStatus::STARTED)
{
startedJobCards.insert(currentJobCard->getId(), currentJobCard);
}
}
return startedJobCards;
}
/*
Function: selectJobCardToComplete
Description: Lists all incomplete job cards assigned to the technician and allows selection by index.
@@ -497,11 +519,17 @@ Parameters:
Returns:
- std::string: ID of the selected job card, or empty string if none selected
*/
inline std::string selectJobCardToComplete(util::Map<std::string, const JobCard*>& assignedJobCards, util::Map<int, const JobCard*>& incompleteJobCards)
inline std::string selectJobCardToComplete(util::Map<std::string, const JobCard*>& assignedJobCards)
{
util::Map<int, const JobCard* > incompleteJobCards;
if (assignedJobCards.getSize() == 0)
{
std::cout << "No started jobs present to complete\n\n";
return "";
}
int currentIndex = 1;
int choice;
bool hasIncompleteJobCard = false;
std::cout << std::endl;
std::cout << std::left
<< std::setw(6) << "Index"
<< std::setw(12) << "BookingID"
@@ -520,14 +548,8 @@ inline std::string selectJobCardToComplete(util::Map<std::string, const JobCard*
<< std::setw(20) << currentJobCard->getService()->getName()
<< std::setw(12) << currentJobCard->getServiceId()
<< std::endl;
hasIncompleteJobCard = true;
incompleteJobCards.insert(currentIndex++, currentJobCard);
}
}
if (!hasIncompleteJobCard)
{
std::cout << "No pending jobs are present.\n";
return "";
}
std::cout << "Select the Job Card to complete (Index): ";
util::read(choice);
@@ -540,6 +562,7 @@ inline std::string selectJobCardToComplete(util::Map<std::string, const JobCard*
else
{
std::cout << "Invalid index.\n";
std::cout << "Failed to complete jobs.\n\n";
return "";
}
}
@@ -93,18 +93,15 @@ Returns:
*/
void TechnicianMenu::completeJob()
{
util::clear();
std::cout << "Complete Job\n";
util::Map<std::string, const JobCard*> assignedJobCards = m_controller.getJobCardsByUser();
util::Map<int, const JobCard*> incompleteJobCards;
std::cout << "Jobs to be completed.\n";
std::string selectedJobID = selectJobCardToComplete(assignedJobCards, incompleteJobCards);
if (selectedJobID == "")
{
std::cout << "Failed to complete the job.\n";
}
else
util::Map<std::string, const JobCard*> startedJobCards = filterStartedJobCards(assignedJobCards);
std::string selectedJobID = selectJobCardToComplete(startedJobCards);
if (!selectedJobID.empty())
{
m_controller.completeJob(selectedJobID);
std::cout << "Job marked as completed.\n";
std::cout << "\nJob marked as completed.\n\n";
}
util::pressEnter();
}