|
|
|
@@ -160,7 +160,7 @@ Parameters:
|
|
|
|
|
Returns:
|
|
|
|
|
- util::Map<std::string, const ServiceBooking*>: map containing only active (PENDING) service bookings
|
|
|
|
|
*/
|
|
|
|
|
inline util::Map<std::string, const ServiceBooking*> filterActiveServiceBookings(util::Map<std::string, const ServiceBooking*> currentBookings)
|
|
|
|
|
inline util::Map<std::string, const ServiceBooking*> filterActiveServiceBookings(util::Map<std::string, const ServiceBooking*>& currentBookings)
|
|
|
|
|
{
|
|
|
|
|
util::Map<std::string, const ServiceBooking*> activeServiceBookings;
|
|
|
|
|
for (int iterator = 0; iterator < currentBookings.getSize(); iterator++)
|
|
|
|
@@ -201,8 +201,6 @@ inline bool listServiceBookings(util::Map<std::string, const ServiceBooking*>& c
|
|
|
|
|
<< std::setw(15) << "VehicleNo"
|
|
|
|
|
<< std::setw(15) << "Brand"
|
|
|
|
|
<< std::setw(15) << "Model"
|
|
|
|
|
<< std::setw(20) << "Technician"
|
|
|
|
|
<< std::setw(15) << "TechnicianID"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
for (int iterator = 0; iterator < bookingsSize; iterator++)
|
|
|
|
|
{
|
|
|
|
@@ -219,8 +217,6 @@ inline bool listServiceBookings(util::Map<std::string, const ServiceBooking*>& c
|
|
|
|
|
<< std::setw(15) << currentBooking->getVehicleNumber()
|
|
|
|
|
<< std::setw(15) << currentBooking->getVehicleBrand()
|
|
|
|
|
<< std::setw(15) << currentBooking->getVehicleModel()
|
|
|
|
|
<< std::setw(20) << ((currentAssignedTechnician == nullptr || currentAssignedTechnician->getName().empty()) ? "NULL" : currentAssignedTechnician->getName())
|
|
|
|
|
<< std::setw(15) << ((currentAssignedTechnician == nullptr || currentAssignedTechnician->getId().empty()) ? "NULL" : currentAssignedTechnician->getId())
|
|
|
|
|
<< std::endl;
|
|
|
|
|
serviceBookingsMap.insert(currentIndex++, currentBooking);
|
|
|
|
|
}
|
|
|
|
@@ -239,7 +235,7 @@ Returns:
|
|
|
|
|
inline const ServiceBooking* selectPendingServiceBookings(util::Map<int, const ServiceBooking*>& serviceBookingsMap)
|
|
|
|
|
{
|
|
|
|
|
int userInputIndex;
|
|
|
|
|
std::cout << "\nEnter a valid service index: ";
|
|
|
|
|
std::cout << "\nEnter a service index: ";
|
|
|
|
|
util::read(userInputIndex);
|
|
|
|
|
if (serviceBookingsMap.find(userInputIndex) != -1)
|
|
|
|
|
{
|
|
|
|
@@ -304,7 +300,7 @@ Returns:
|
|
|
|
|
inline const User* selectTechnician(util::Map<int, const User*>& currentAvailableTechniciansMap)
|
|
|
|
|
{
|
|
|
|
|
int userInputIndex;
|
|
|
|
|
std::cout << "\nEnter valid technician index: ";
|
|
|
|
|
std::cout << "\nEnter technician index: ";
|
|
|
|
|
util::read(userInputIndex);
|
|
|
|
|
if (currentAvailableTechniciansMap.find(userInputIndex) != -1)
|
|
|
|
|
{
|
|
|
|
@@ -416,6 +412,73 @@ inline util::PaymentMode selectPaymentMode()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Function: displayInvoicesInTabularForm
|
|
|
|
|
Description:
|
|
|
|
|
Displays all invoices in a tabular format. Each row shows booking details,
|
|
|
|
|
vehicle info, technician details, discount, total amount, invoice date,
|
|
|
|
|
and payment status. If inventory items exist for an invoice, they are
|
|
|
|
|
displayed in a separate table below the invoice row.
|
|
|
|
|
Parameters:
|
|
|
|
|
- currentInvoices: util::Map<std::string, const Invoice*>
|
|
|
|
|
Map of invoice IDs to Invoice pointers.
|
|
|
|
|
Returns:
|
|
|
|
|
- void
|
|
|
|
|
*/
|
|
|
|
|
inline const Invoice* selectInvoiceToDisplay(util::Map<std::string, const Invoice*>& currentInvoices)
|
|
|
|
|
{
|
|
|
|
|
int currentIndex = 1, choice;
|
|
|
|
|
util::Map<int, const Invoice*> currentInvoicesIndexMap;
|
|
|
|
|
if (currentInvoices.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
std::cout << "No invoices available.\n\n";
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
std::cout
|
|
|
|
|
<< std::left
|
|
|
|
|
<< std::setw(10) << "Index"
|
|
|
|
|
<< std::setw(12) << "BookingID"
|
|
|
|
|
<< std::setw(15) << "VehicleNumber"
|
|
|
|
|
<< std::setw(20) << "TechnicianName"
|
|
|
|
|
<< std::setw(15) << "TotalAmount"
|
|
|
|
|
<< std::setw(25) << "InvoiceDate"
|
|
|
|
|
<< std::setw(15) << "PaymentStatus"
|
|
|
|
|
<< std::setw(15) << "PaymentMode"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
for (int iterator = 0; iterator < currentInvoices.getSize(); iterator++)
|
|
|
|
|
{
|
|
|
|
|
const Invoice* currentInvoice = currentInvoices.getValueAt(iterator);
|
|
|
|
|
if (!currentInvoice)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
const User* currentTechnician = currentInvoice->getBooking()->getAssignedTechnician();
|
|
|
|
|
std::cout << std::left
|
|
|
|
|
<< std::setw(10) << currentIndex
|
|
|
|
|
<< std::setw(12) << currentInvoice->getBookingId()
|
|
|
|
|
<< std::setw(15) << currentInvoice->getBooking()->getVehicleNumber()
|
|
|
|
|
<< std::setw(20) << ((currentTechnician && !currentTechnician->getName().empty()) ? currentTechnician->getName() : "NULL")
|
|
|
|
|
<< std::setw(15) << currentInvoice->getTotalAmount()
|
|
|
|
|
<< std::setw(25) << currentInvoice->getInvoiceDate().toString()
|
|
|
|
|
<< std::setw(15) << util::getPaymentStatusString(currentInvoice->getStatus())
|
|
|
|
|
<< std::setw(15) << util::getPaymentModeString(currentInvoice->getPaymentMethod())
|
|
|
|
|
<< std::endl;
|
|
|
|
|
currentInvoicesIndexMap.insert(currentIndex++, currentInvoice);
|
|
|
|
|
}
|
|
|
|
|
std::cout << "Enter an index: ";
|
|
|
|
|
util::read(choice);
|
|
|
|
|
int currentSelectedIndex = currentInvoicesIndexMap.find(choice);
|
|
|
|
|
if (currentSelectedIndex != -1)
|
|
|
|
|
{
|
|
|
|
|
return currentInvoicesIndexMap.getValueAt(currentSelectedIndex);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::cout << "Enter a valid index.\n";
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Function: displayInvoices
|
|
|
|
|
Description: Displays detailed information for all invoices associated with the customer,
|
|
|
|
@@ -429,34 +492,48 @@ Throws:
|
|
|
|
|
*/
|
|
|
|
|
inline void displayInvoices(util::Map<std::string, const Invoice*> currentUserInvoices)
|
|
|
|
|
{
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
if (currentUserInvoices.getSize() == 0)
|
|
|
|
|
{
|
|
|
|
|
std::cout << "No invoices found for this account." << std::endl << std::endl;
|
|
|
|
|
std::cout << "No invoices found for this account.\n\n";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (int index = 0; index < currentUserInvoices.getSize(); index++)
|
|
|
|
|
bool doRun = true;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
const Invoice* currentInvoice = currentUserInvoices.getValueAt(index);
|
|
|
|
|
if (currentInvoice)
|
|
|
|
|
const Invoice* selectedInvoice;
|
|
|
|
|
int choice;
|
|
|
|
|
selectedInvoice = selectInvoiceToDisplay(currentUserInvoices);
|
|
|
|
|
if (selectedInvoice)
|
|
|
|
|
{
|
|
|
|
|
const User* currentTechnician = currentInvoice->getBooking()->getAssignedTechnician();
|
|
|
|
|
std::cout << "\nInvoice Details\n";
|
|
|
|
|
std::cout << "Booking ID: " << currentInvoice->getBookingId() << std::endl;
|
|
|
|
|
std::cout << "Vehicle Brand: " << currentInvoice->getBooking()->getVehicleBrand() << std::endl;
|
|
|
|
|
std::cout << "Vehicle Number: " << currentInvoice->getBooking()->getVehicleNumber() << std::endl;
|
|
|
|
|
std::cout << "Technician ID: " <<
|
|
|
|
|
((currentTechnician != nullptr && currentTechnician->getId() != "") ?
|
|
|
|
|
currentTechnician->getId() : "Null") << std::endl;
|
|
|
|
|
std::cout << "Technician Name: " <<
|
|
|
|
|
((currentTechnician != nullptr && currentTechnician->getName() != "") ?
|
|
|
|
|
currentTechnician->getName() : "Null") << std::endl;
|
|
|
|
|
std::cout << "Discount(%): " << currentInvoice->getDiscountPercentage() << std::endl;
|
|
|
|
|
std::cout << "Total Amount: " << currentInvoice->getTotalAmount() << std::endl;
|
|
|
|
|
std::cout << "Invoice Date: " << currentInvoice->getInvoiceDate().toString() << std::endl;
|
|
|
|
|
std::cout << "Payment Status: " << util::getPaymentStatusString(currentInvoice->getStatus()) << std::endl;
|
|
|
|
|
auto inventoryItemsInInvoice = currentInvoice->getParts();
|
|
|
|
|
const User* currentTechnician = selectedInvoice->getBooking()->getAssignedTechnician();
|
|
|
|
|
util::clear();
|
|
|
|
|
std::cout << "Invoice Details\n";
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Booking ID:"
|
|
|
|
|
<< selectedInvoice->getBookingId() << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Vehicle Brand:"
|
|
|
|
|
<< selectedInvoice->getBooking()->getVehicleBrand() << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Vehicle Number:"
|
|
|
|
|
<< selectedInvoice->getBooking()->getVehicleNumber() << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Technician ID:"
|
|
|
|
|
<< ((currentTechnician != nullptr && !currentTechnician->getId().empty())
|
|
|
|
|
? currentTechnician->getId() : "NULL") << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Technician Name:"
|
|
|
|
|
<< ((currentTechnician != nullptr && !currentTechnician->getName().empty())
|
|
|
|
|
? currentTechnician->getName() : "NULL") << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Discount(%):"
|
|
|
|
|
<< selectedInvoice->getDiscountPercentage() << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Total Amount:"
|
|
|
|
|
<< selectedInvoice->getTotalAmount() << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Invoice Date:"
|
|
|
|
|
<< selectedInvoice->getInvoiceDate().toString() << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Payment Status:"
|
|
|
|
|
<< util::getPaymentStatusString(selectedInvoice->getStatus()) << std::endl;
|
|
|
|
|
std::cout << std::left << std::setw(20) << "Payment Mode:"
|
|
|
|
|
<< util::getPaymentModeString(selectedInvoice->getPaymentMethod()) << std::endl;
|
|
|
|
|
auto inventoryItemsInInvoice = selectedInvoice->getParts();
|
|
|
|
|
if (inventoryItemsInInvoice.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
std::cout << "No inventory items used.\n\n";
|
|
|
|
@@ -478,14 +555,53 @@ inline void displayInvoices(util::Map<std::string, const Invoice*> currentUserIn
|
|
|
|
|
<< std::setw(10) << currentItem->getPrice()
|
|
|
|
|
<< std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << "\n\nDo you want to display another Invoice (1-Yes, 2-No): ";
|
|
|
|
|
util::read(choice);
|
|
|
|
|
if (choice == 1)
|
|
|
|
|
{
|
|
|
|
|
doRun = true;
|
|
|
|
|
util::clear();
|
|
|
|
|
}
|
|
|
|
|
else if (choice == 2)
|
|
|
|
|
{
|
|
|
|
|
doRun = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::cout << "Invalid choice\n";
|
|
|
|
|
doRun = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw std::runtime_error("Null invoice encountered while displaying invoices.");
|
|
|
|
|
std::cout << "Unable to fetch the selected invoice\n";
|
|
|
|
|
doRun = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} while (doRun);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
util::pressEnter();
|
|
|
|
|
return startedJobCards;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@@ -497,49 +613,50 @@ 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)
|
|
|
|
|
{
|
|
|
|
|
int currentIndex = 1;
|
|
|
|
|
int choice;
|
|
|
|
|
bool hasIncompleteJobCard = false;
|
|
|
|
|
std::cout << std::left
|
|
|
|
|
<< std::setw(6) << "Index"
|
|
|
|
|
<< std::setw(12) << "BookingID"
|
|
|
|
|
<< std::setw(12) << "JobID"
|
|
|
|
|
<< std::setw(20) << "ServiceName"
|
|
|
|
|
<< std::setw(12) << "ServiceID"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
|
|
|
|
|
std::cout << "No started jobs available to complete.\n";
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
int currentIndex = 1;
|
|
|
|
|
int choice;
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
std::cout << std::left
|
|
|
|
|
<< std::setw(6) << "Index"
|
|
|
|
|
<< std::setw(12) << "BookingID"
|
|
|
|
|
<< std::setw(12) << "JobID"
|
|
|
|
|
<< std::setw(20) << "ServiceName"
|
|
|
|
|
<< std::setw(12) << "ServiceID"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
|
|
|
|
|
{
|
|
|
|
|
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
|
|
|
|
|
if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED))
|
|
|
|
|
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
|
|
|
|
|
if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED))
|
|
|
|
|
{
|
|
|
|
|
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(12) << currentJobCard->getServiceId()
|
|
|
|
|
<< std::endl;
|
|
|
|
|
hasIncompleteJobCard = true;
|
|
|
|
|
incompleteJobCards.insert(currentIndex++, currentJobCard);
|
|
|
|
|
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(12) << currentJobCard->getServiceId()
|
|
|
|
|
<< std::endl;
|
|
|
|
|
incompleteJobCards.insert(currentIndex++, currentJobCard);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!hasIncompleteJobCard)
|
|
|
|
|
{
|
|
|
|
|
std::cout << "No pending jobs are present.\n";
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
std::cout << "Select the Job Card to complete (Index): ";
|
|
|
|
|
std::cout << "Select the Job Card to complete (Index): ";
|
|
|
|
|
util::read(choice);
|
|
|
|
|
int selectedJobCardIndex = incompleteJobCards.find(choice);
|
|
|
|
|
if (selectedJobCardIndex != -1)
|
|
|
|
|
int selectedJobCardIndex = incompleteJobCards.find(choice);
|
|
|
|
|
if (selectedJobCardIndex != -1)
|
|
|
|
|
{
|
|
|
|
|
const JobCard* selectedJobCard = incompleteJobCards.getValueAt(selectedJobCardIndex);
|
|
|
|
|
return selectedJobCard->getId();
|
|
|
|
|
const JobCard* selectedJobCard = incompleteJobCards.getValueAt(selectedJobCardIndex);
|
|
|
|
|
return selectedJobCard->getId();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::cout << "Invalid index.\n";
|
|
|
|
|
std::cout << "Invalid index.\n";
|
|
|
|
|
std::cout << "Failed to complete jobs.\n\n";
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -753,7 +870,7 @@ Parameters:
|
|
|
|
|
Returns:
|
|
|
|
|
- util::Map<std::string, const Service*> containing only active services.
|
|
|
|
|
*/
|
|
|
|
|
inline util::Map<std::string, const Service*> filterActiveServices(util::Map<std::string, const Service*> serviceList)
|
|
|
|
|
inline util::Map<std::string, const Service*> filterActiveServices(util::Map<std::string, const Service*>& serviceList)
|
|
|
|
|
{
|
|
|
|
|
util::Map<std::string, const Service*> activeServices;
|
|
|
|
|
for (int iterator = 0; iterator < serviceList.getSize(); iterator++)
|
|
|
|
@@ -780,6 +897,7 @@ inline const Service* selectServiceFromServices(const util::Map<std::string, con
|
|
|
|
|
std::cout << "No active services available." << std::endl;
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
util::Map<int, const Service*> activeServicesMap;
|
|
|
|
|
int currentIndex = 1;
|
|
|
|
|
int userInputIndex;
|
|
|
|
@@ -826,6 +944,31 @@ inline const Service* selectServiceFromServices(const util::Map<std::string, con
|
|
|
|
|
return activeServicesMap[userInputIndex];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Function: filterComboPackages
|
|
|
|
|
Description:
|
|
|
|
|
Filters the given list of combo packages and returns only those that are ACTIVE.
|
|
|
|
|
Parameters:
|
|
|
|
|
- comboPackages: util::Map<std::string, const ComboPackage*>&
|
|
|
|
|
Map of combo package IDs to ComboPackage pointers.
|
|
|
|
|
Returns:
|
|
|
|
|
- util::Map<std::string, const ComboPackage*>
|
|
|
|
|
Map containing only active combo packages.
|
|
|
|
|
*/
|
|
|
|
|
inline util::Map<std::string, const ComboPackage*> filterComboPackages(util::Map<std::string, const ComboPackage*>& comboPackages)
|
|
|
|
|
{
|
|
|
|
|
util::Map<std::string, const ComboPackage*> activeComboPackages;
|
|
|
|
|
for (int iterator = 0; iterator < comboPackages.getSize(); iterator++)
|
|
|
|
|
{
|
|
|
|
|
const ComboPackage* currentComboPackage = comboPackages.getValueAt(iterator);
|
|
|
|
|
if (currentComboPackage && currentComboPackage->getState() == util::State::ACTIVE)
|
|
|
|
|
{
|
|
|
|
|
activeComboPackages.insert(currentComboPackage->getId(), currentComboPackage);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return activeComboPackages;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Function: selectComboPackageFromPackages
|
|
|
|
|
Description: Displays active combo packages and allows the customer to select one by index.
|
|
|
|
@@ -837,10 +980,11 @@ inline const ComboPackage* selectComboPackageFromPackages(const util::Map<std::s
|
|
|
|
|
util::Map<int, const ComboPackage*> activeComboPackages;
|
|
|
|
|
int currentIndex = 1;
|
|
|
|
|
int userInputIndex;
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
std::cout << std::left
|
|
|
|
|
<< std::setw(10) << "Index"
|
|
|
|
|
<< std::setw(15) << "Combo ID"
|
|
|
|
|
<< std::setw(15) << "Combo Name"
|
|
|
|
|
<< std::setw(35) << "Combo Name"
|
|
|
|
|
<< std::setw(15) << "Estimate Cost"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
for (int index = 0; index < comboPackages.getSize(); index++)
|
|
|
|
@@ -854,7 +998,7 @@ inline const ComboPackage* selectComboPackageFromPackages(const util::Map<std::s
|
|
|
|
|
std::cout << std::left
|
|
|
|
|
<< std::setw(10) << currentIndex
|
|
|
|
|
<< std::setw(15) << currentComboPackage->getId()
|
|
|
|
|
<< std::setw(25) << currentComboPackage->getPackageName()
|
|
|
|
|
<< std::setw(35) << util::truncateString(currentComboPackage->getPackageName(), 30)
|
|
|
|
|
<< std::setw(15) << util::calculateComboServiceEstimatedCost(currentComboPackage)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
currentIndex++;
|
|
|
|
|