Merge branch 'feature-payment-management' into feature-1553-1598
This commit is contained in:
@@ -1,10 +1,15 @@
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include "CustomerMenu.h"
|
||||
#include "InputHelper.h"
|
||||
#include "OutputHelper.h"
|
||||
#include "User.h"
|
||||
#include "ServiceBooking.h"
|
||||
#include "Invoice.h"
|
||||
#include "Enums.h"
|
||||
#include "ServiceBooking.h"
|
||||
#include "User.h"
|
||||
#include "Timestamp.h"
|
||||
#include "Service.h"
|
||||
#include "InventoryItem.h"
|
||||
|
||||
void CustomerMenu::showMenu()
|
||||
{
|
||||
@@ -106,12 +111,197 @@ void CustomerMenu::viewServiceHistory()
|
||||
}
|
||||
}
|
||||
|
||||
void CustomerMenu::completePayments()
|
||||
/*
|
||||
Function: selectInvoiceFromUserForPayment (static helper)
|
||||
Description: Lists all pending invoices for the customer and allows selection by index.
|
||||
Parameters:
|
||||
- currentInvoices: util::Map<std::string, const Invoice*>&, map of customer invoices
|
||||
Returns:
|
||||
- std::string: ID of the selected invoice, or empty string if none selected
|
||||
*/
|
||||
static std::string selectInvoiceFromUserForPayment(const util::Map<std::string, const Invoice*>& currentInvoices)
|
||||
{
|
||||
int currentIndex = 1, choice;
|
||||
util::Map<int, const Invoice*> pendingInvoicesForPayment;
|
||||
std::cout << std::left
|
||||
<< std::setw(6) << "Index"
|
||||
<< std::setw(12) << "BookingID"
|
||||
<< std::setw(15) << "VehicleBrand"
|
||||
<< std::setw(15) << "VehicleNumber"
|
||||
<< std::setw(12) << "TechID"
|
||||
<< std::setw(20) << "TechnicianName"
|
||||
<< std::setw(10) << "Discount(%)"
|
||||
<< std::setw(12) << "TotalAmount"
|
||||
<< std::setw(20) << "InvoiceDate"
|
||||
<< std::endl;
|
||||
for (int iterator = 0; iterator < currentInvoices.getSize(); iterator++)
|
||||
{
|
||||
const Invoice* currentInvoice = currentInvoices.getValueAt(iterator);
|
||||
if (currentInvoice && currentInvoice->getStatus() == util::PaymentStatus::PENDING)
|
||||
{
|
||||
std::cout << std::left
|
||||
<< std::setw(6) << currentIndex
|
||||
<< std::setw(12) << currentInvoice->getBookingId()
|
||||
<< std::setw(15) << currentInvoice->getBooking()->getVehicleBrand()
|
||||
<< std::setw(15) << currentInvoice->getBooking()->getVehicleNumber()
|
||||
<< std::setw(12) << currentInvoice->getBooking()->getAssignedTechnician()->getId()
|
||||
<< std::setw(20) << currentInvoice->getBooking()->getAssignedTechnician()->getName()
|
||||
<< std::setw(10) << currentInvoice->getDiscountPercentage()
|
||||
<< std::setw(12) << currentInvoice->getTotalAmount()
|
||||
<< std::setw(20) << currentInvoice->getInvoiceDate().toString()
|
||||
<< std::endl;
|
||||
pendingInvoicesForPayment.insert(currentIndex++, currentInvoice);
|
||||
}
|
||||
}
|
||||
if (pendingInvoicesForPayment.getSize() == 0)
|
||||
{
|
||||
std::cout << "No pending invoices available for payment.\n";
|
||||
return "";
|
||||
}
|
||||
std::cout << "Select the Invoice to pay (Index): ";
|
||||
util::read(choice);
|
||||
int selectedIndex = pendingInvoicesForPayment.find(choice);
|
||||
if (selectedIndex != -1)
|
||||
{
|
||||
const Invoice* selectedInvoice = pendingInvoicesForPayment.getValueAt(selectedIndex);
|
||||
return selectedInvoice->getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Invalid choice.\n";
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Function: selectPaymentMode (static helper)
|
||||
Description: Allows the customer to select a payment mode (ONLINE or OFFLINE).
|
||||
Parameters:
|
||||
- None
|
||||
Returns:
|
||||
- util::PaymentMode: Selected payment mode
|
||||
*/
|
||||
static util::PaymentMode selectPaymentMode()
|
||||
{
|
||||
int choice;
|
||||
std::cout << "Enter the payment Mode\n1.OFFLINE\n2.ONLINE\nChoice: ";
|
||||
util::read(choice);
|
||||
if (choice == 1)
|
||||
{
|
||||
std::cout << "Offline mode selected.\n";
|
||||
return util::PaymentMode::OFFLINE;
|
||||
}
|
||||
else if (choice == 2)
|
||||
{
|
||||
std::cout << "Online mode selected.\n";
|
||||
return util::PaymentMode::ONLINE;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Invalid choice, Offline mode selected.\n";
|
||||
return util::PaymentMode::OFFLINE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Function: completePayments
|
||||
Description: Allows the customer to complete pending payments for invoices.
|
||||
Validates invoice selection and payment mode before completing payment.
|
||||
Parameters:
|
||||
- None
|
||||
Returns:
|
||||
- void
|
||||
*/
|
||||
void CustomerMenu::completePayments()
|
||||
{
|
||||
util::clear();
|
||||
util::Map<std::string, const Invoice*> currentInvoices = m_controller.getInvoicesByUser();
|
||||
std::string selectedID = selectInvoiceFromUserForPayment(currentInvoices);
|
||||
if (selectedID == "")
|
||||
{
|
||||
std::cout << "Payment failed.\n";
|
||||
return;
|
||||
}
|
||||
util::PaymentMode paymentMode = selectPaymentMode();
|
||||
m_controller.completePayment(selectedID, paymentMode);
|
||||
std::cout << "Payment completed successfully.\n";
|
||||
}
|
||||
|
||||
/*
|
||||
Function: displayInvoices (static helper)
|
||||
Description: Displays detailed information for all invoices associated with the customer,
|
||||
including booking details, technician, discount, total amount, payment status, and items used.
|
||||
Parameters:
|
||||
- currentUserInvoices: util::Map<std::string, const Invoice*>, customer’s invoices
|
||||
Returns:
|
||||
- void
|
||||
Throws:
|
||||
- std::runtime_error if a null invoice is encountered
|
||||
*/
|
||||
static void displayInvoices(util::Map<std::string, const Invoice*> currentUserInvoices)
|
||||
{
|
||||
if (currentUserInvoices.getSize() == 0)
|
||||
{
|
||||
std::cout << "No invoices found for this account." << std::endl;
|
||||
util::pressEnter();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int index = 0; index < currentUserInvoices.getSize(); index++)
|
||||
{
|
||||
const Invoice* currentInvoice = currentUserInvoices.getValueAt(index);
|
||||
if (currentInvoice)
|
||||
{
|
||||
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: " << currentInvoice->getBooking()->getAssignedTechnician()->getId() << std::endl;
|
||||
std::cout << "Technician Name: " << currentInvoice->getBooking()->getAssignedTechnician()->getName() << 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();
|
||||
std::cout << "\nItems Used:\n";
|
||||
std::cout << std::left
|
||||
<< std::setw(20) << "ItemName"
|
||||
<< std::setw(10) << "Quantity"
|
||||
<< std::setw(10) << "Price"
|
||||
<< std::endl;
|
||||
std::cout << std::string(40, '-') << std::endl;
|
||||
for (int iterator = 0; iterator < inventoryItemsInInvoice.getSize(); iterator++)
|
||||
{
|
||||
InventoryItem* currentItem = inventoryItemsInInvoice.getValueAt(iterator);
|
||||
std::cout << std::left
|
||||
<< std::setw(20) << currentItem->getPartName()
|
||||
<< std::setw(10) << currentItem->getQuantity()
|
||||
<< std::setw(10) << currentItem->getPrice()
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::runtime_error("Null invoice encountered while displaying invoices.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Function: viewInvoices
|
||||
Description: Displays invoices associated with the customer by calling displayInvoices.
|
||||
Parameters:
|
||||
- None
|
||||
Returns:
|
||||
- void
|
||||
*/
|
||||
void CustomerMenu::viewInvoices()
|
||||
{
|
||||
util::clear();
|
||||
util::Map<std::string, const Invoice*> currentUserInvoices = m_controller.getInvoicesByUser();
|
||||
displayInvoices(currentUserInvoices);
|
||||
}
|
||||
|
||||
void CustomerMenu::viewNotifications()
|
||||
|
||||
Reference in New Issue
Block a user