Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f02f1db44 |
@@ -462,38 +462,6 @@ util::Map<std::string, const Invoice*> Controller::getInvoicesByUser()
|
|||||||
return userInvoicesReadOnly;
|
return userInvoicesReadOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Function: getAllInvoices
|
|
||||||
Description: Retrieves all invoices from the PaymentManagementService and returns them as a read-only map.
|
|
||||||
Parameters:
|
|
||||||
- none
|
|
||||||
Returns:
|
|
||||||
- util::Map<std::string, const Invoice*>: Map of invoice IDs to invoice objects
|
|
||||||
*/
|
|
||||||
util::Map<std::string, const Invoice*> Controller::getAllInvoices()
|
|
||||||
{
|
|
||||||
auto invoices = m_paymentManagementService.getAllInvoices();
|
|
||||||
util::Map<std::string, const Invoice*> readOnlyInvoice;
|
|
||||||
for (int iterator = 0; iterator < invoices.getSize(); iterator++)
|
|
||||||
{
|
|
||||||
readOnlyInvoice.insert(invoices.getKeyAt(iterator), invoices.getValueAt(iterator));
|
|
||||||
}
|
|
||||||
return readOnlyInvoice;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Function: confirmPayment
|
|
||||||
Description: Delegates payment confirmation for a given invoice ID to the PaymentManagementService.
|
|
||||||
Parameters:
|
|
||||||
- invoiceID: std::string, ID of the invoice to confirm
|
|
||||||
Returns:
|
|
||||||
- void
|
|
||||||
*/
|
|
||||||
void Controller::confirmPayment(const std::string& invoiceID)
|
|
||||||
{
|
|
||||||
m_paymentManagementService.confirmPayment(invoiceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Function: completePayment
|
Function: completePayment
|
||||||
Description: Completes payment for a specific invoice using the given payment mode.
|
Description: Completes payment for a specific invoice using the given payment mode.
|
||||||
|
|||||||
@@ -64,8 +64,6 @@ public:
|
|||||||
void createComboPackage(const std::string& name, const util::Vector<std::string>& serviceIDs, double discountPercentage);
|
void createComboPackage(const std::string& name, const util::Vector<std::string>& serviceIDs, double discountPercentage);
|
||||||
void removeComboPackage(const std::string& comboPackageID);
|
void removeComboPackage(const std::string& comboPackageID);
|
||||||
util::Map<std::string, const Invoice*> getInvoicesByUser();
|
util::Map<std::string, const Invoice*> getInvoicesByUser();
|
||||||
util::Map<std::string, const Invoice*> getAllInvoices();
|
|
||||||
void confirmPayment(const std::string& invoiceID);
|
|
||||||
void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode);
|
void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode);
|
||||||
util::Vector<const Notification*> getNotifications();
|
util::Vector<const Notification*> getNotifications();
|
||||||
void deleteNotification(const std::string& notificationID);
|
void deleteNotification(const std::string& notificationID);
|
||||||
|
|||||||
+2
-46
@@ -368,12 +368,12 @@ void PaymentManagementService::completePayment(const std::string& invoiceID, uti
|
|||||||
if (invoiceIndex != -1)
|
if (invoiceIndex != -1)
|
||||||
{
|
{
|
||||||
Invoice* invoice = currentInvoices.getValueAt(invoiceIndex);
|
Invoice* invoice = currentInvoices.getValueAt(invoiceIndex);
|
||||||
if (invoice && invoice->getStatus() != util::PaymentStatus::PAID)
|
if (invoice && invoice->getStatus() != util::PaymentStatus::COMPLETED)
|
||||||
{
|
{
|
||||||
User* currentUser = invoice->getBooking()->getCustomer();
|
User* currentUser = invoice->getBooking()->getCustomer();
|
||||||
invoice->setPaymentMethod(paymentMode);
|
invoice->setPaymentMethod(paymentMode);
|
||||||
invoice->setPaymentDate(util::Timestamp());
|
invoice->setPaymentDate(util::Timestamp());
|
||||||
invoice->setStatus(util::PaymentStatus::PAID);
|
invoice->setStatus(util::PaymentStatus::COMPLETED);
|
||||||
std::string title, message;
|
std::string title, message;
|
||||||
title = "Payment successful";
|
title = "Payment successful";
|
||||||
message = "Payment successful for Invoice ID " + invoiceID;
|
message = "Payment successful for Invoice ID " + invoiceID;
|
||||||
@@ -385,47 +385,3 @@ void PaymentManagementService::completePayment(const std::string& invoiceID, uti
|
|||||||
throw std::runtime_error("Payment failed: invalid invoice ID.");
|
throw std::runtime_error("Payment failed: invalid invoice ID.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Function: getAllInvoice
|
|
||||||
Description: Provides access to all invoices stored in the data store.
|
|
||||||
Parameters:
|
|
||||||
- none
|
|
||||||
Returns:
|
|
||||||
- util::Map<std::string, Invoice*>&: Map of invoice IDs to invoice objects
|
|
||||||
*/
|
|
||||||
util::Map<std::string, Invoice*>& PaymentManagementService::getAllInvoices()
|
|
||||||
{
|
|
||||||
return m_dataStore.getInvoices();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Function: confirmPayment
|
|
||||||
Description: Confirms payment for a specific invoice. Updates payment date and status,
|
|
||||||
then sends a notification to the customer.
|
|
||||||
Parameters:
|
|
||||||
- invoiceID: std::string, ID of the invoice to confirm
|
|
||||||
Returns:
|
|
||||||
- void
|
|
||||||
Throws:
|
|
||||||
- std::runtime_error if the invoice ID is invalid
|
|
||||||
*/
|
|
||||||
void PaymentManagementService::confirmPayment(const std::string& invoiceID)
|
|
||||||
{
|
|
||||||
auto& currentInvoices = m_dataStore.getInvoices();
|
|
||||||
int invoiceIndex = currentInvoices.find(invoiceID);
|
|
||||||
if (invoiceIndex == -1)
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Payment confirmation failed: invalid invoice ID.");
|
|
||||||
}
|
|
||||||
Invoice* invoice = currentInvoices.getValueAt(invoiceIndex);
|
|
||||||
if (!invoice || invoice->getStatus() != util::PaymentStatus::PAID)
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Payment confirmation failed: invoice is not awaiting confirmation.");
|
|
||||||
}
|
|
||||||
User* currentUser = invoice->getBooking()->getCustomer();
|
|
||||||
invoice->setStatus(util::PaymentStatus::COMPLETED);
|
|
||||||
std::string title = "Payment Confirmed";
|
|
||||||
std::string message = "Payment Confirmed for Invoice ID " + invoiceID;
|
|
||||||
sendNotification(currentUser, title, message);
|
|
||||||
}
|
|
||||||
-2
@@ -28,8 +28,6 @@ public:
|
|||||||
void generateInvoice(ServiceBooking* booking);
|
void generateInvoice(ServiceBooking* booking);
|
||||||
util::Map<std::string, Invoice*> getInvoices(const std::string& customerID);
|
util::Map<std::string, Invoice*> getInvoices(const std::string& customerID);
|
||||||
void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode);
|
void completePayment(const std::string& invoiceID, util::PaymentMode paymentMode);
|
||||||
util::Map<std::string, Invoice*>& getAllInvoices();
|
|
||||||
void confirmPayment(const std::string& invoiceID);
|
|
||||||
void sendPaymentReminders();
|
void sendPaymentReminders();
|
||||||
void sendNotification(User* user, const std::string& title, const std::string& message) override;
|
void sendNotification(User* user, const std::string& title, const std::string& message) override;
|
||||||
void attach(User* user) override;
|
void attach(User* user) override;
|
||||||
|
|||||||
+63
-64
@@ -543,65 +543,50 @@ static void restoreInventory(ServiceBooking* booking)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Function: processBookingCancellation
|
Function: processBookingCancellation
|
||||||
Description: Handles cancellation or reassignment of a service booking based on user type.
|
Description: Cancels jobs and updates the status of a given booking. Sends notifications to the
|
||||||
Cancels associated job cards, updates booking status, clears technician assignments,
|
specified user, resets technician assignment if needed, and restores inventory items.
|
||||||
restores inventory, and sends appropriate notifications.
|
Parameter: ServiceBooking* booking - Pointer to the booking being cancelled
|
||||||
Parameters:
|
util::ServiceJobStatus newServiceBookingStatus - New status to assign to the booking
|
||||||
ServiceBooking* booking - The booking to cancel or reset
|
const std::string& notificationTitle - Title of the booking cancellation notification
|
||||||
|
const std::string& notificationMessage - Message body of the booking cancellation notification
|
||||||
|
User* notifyUser - User to notify about the cancellation
|
||||||
|
util::ServiceJobStatus jobCardStatus - New status to assign to associated job cards
|
||||||
|
const std::string& jobNotificationTitle - Title of the job cancellation notification
|
||||||
|
const std::string& jobNotificationMessage - Message body of the job cancellation notification
|
||||||
util::Map<std::string, JobCard*>& jobs - Collection of job cards to update
|
util::Map<std::string, JobCard*>& jobs - Collection of job cards to update
|
||||||
ServiceManagementService& currentService - Service layer for notifications
|
ServiceManagementService& currentService - Reference to the service for sending notifications
|
||||||
util::UserType userType - Type of user initiating cancellation (CUSTOMER or TECHNICIAN)
|
|
||||||
Return type: void
|
Return type: void
|
||||||
*/
|
*/
|
||||||
static void processBookingCancellation(ServiceBooking* booking,
|
static void processBookingCancellation(ServiceBooking* booking,
|
||||||
util::Map<std::string, JobCard*>& jobs,
|
util::ServiceJobStatus newServiceBookingStatus,
|
||||||
ServiceManagementService& currentService,
|
const std::string& notificationTitle,
|
||||||
util::UserType userType)
|
const std::string& notificationMessage,
|
||||||
|
User* notifyUser,
|
||||||
|
util::ServiceJobStatus jobCardStatus,
|
||||||
|
const std::string& jobNotificationTitle,
|
||||||
|
const std::string& jobNotificationMessage,
|
||||||
|
util::Map<std::string, JobCard*>& jobs, ServiceManagementService& currentService)
|
||||||
{
|
{
|
||||||
if (!booking)
|
if (!booking || !notifyUser)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (int jobIterator = 0; jobIterator < jobs.getSize(); ++jobIterator)
|
for (int jobIterator = 0; jobIterator < jobs.getSize(); ++jobIterator)
|
||||||
{
|
{
|
||||||
JobCard* jobCard = jobs.getValueAt(jobIterator);
|
JobCard* jobCard = jobs.getValueAt(jobIterator);
|
||||||
if (!jobCard || jobCard->getBookingId() != booking->getId() || jobCard->getStatus() == util::ServiceJobStatus::CANCELLED)
|
if (jobCard && jobCard->getBookingId() == booking->getId())
|
||||||
{
|
{
|
||||||
continue;
|
jobCard->setStatus(jobCardStatus);
|
||||||
|
currentService.sendNotification(notifyUser, jobNotificationTitle, jobNotificationMessage);
|
||||||
}
|
}
|
||||||
jobCard->setStatus(util::ServiceJobStatus::CANCELLED);
|
}
|
||||||
if (userType == util::UserType::CUSTOMER)
|
booking->setStatus(newServiceBookingStatus);
|
||||||
|
currentService.sendNotification(notifyUser, notificationTitle, notificationMessage);
|
||||||
|
if (newServiceBookingStatus == util::ServiceJobStatus::PENDING)
|
||||||
{
|
{
|
||||||
if (User* technician = booking->getAssignedTechnician())
|
|
||||||
{
|
|
||||||
const std::string jobTitle = "Job Cancelled";
|
|
||||||
const std::string jobMessage = "Your job card has been cancelled and the inventory has been restocked.";
|
|
||||||
currentService.sendNotification(technician, jobTitle, jobMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (userType == util::UserType::CUSTOMER)
|
|
||||||
{
|
|
||||||
booking->setStatus(util::ServiceJobStatus::CANCELLED);
|
|
||||||
if (User* technician = booking->getAssignedTechnician())
|
|
||||||
{
|
|
||||||
const std::string title = "Customer Service Cancelled";
|
|
||||||
const std::string message = "Your assigned job card has been cancelled and the inventory has been restocked.";
|
|
||||||
currentService.sendNotification(technician, title, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (userType == util::UserType::TECHNICIAN)
|
|
||||||
{
|
|
||||||
booking->setStatus(util::ServiceJobStatus::PENDING);
|
|
||||||
if (User* customer = booking->getCustomer())
|
|
||||||
{
|
|
||||||
const std::string title = "Technician Unavailable";
|
|
||||||
const std::string message = "Your booking has been reset to pending and we will reassign a new technician shortly.";
|
|
||||||
currentService.sendNotification(customer, title, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
booking->setAssignedTechnician(nullptr);
|
booking->setAssignedTechnician(nullptr);
|
||||||
booking->setAssignedTechnicianId("");
|
booking->setAssignedTechnicianId("");
|
||||||
|
}
|
||||||
restoreInventory(booking);
|
restoreInventory(booking);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -639,13 +624,21 @@ void ServiceManagementService::cancelCustomerServiceBookings(const std::string&
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (booking->getStatus() != util::ServiceJobStatus::PENDING &&
|
if (booking->getStatus() != util::ServiceJobStatus::PENDING && booking->getStatus() != util::ServiceJobStatus::STARTED)
|
||||||
booking->getStatus() != util::ServiceJobStatus::STARTED &&
|
|
||||||
booking->getStatus() != util::ServiceJobStatus::IN_PROGRESS)
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
processBookingCancellation(booking, jobs, *this, util::UserType::CUSTOMER);
|
User* assignedTechnician = booking->getAssignedTechnician();
|
||||||
|
std::string titleToTechnician = "Customer Service Cancelled";
|
||||||
|
std::string messageToTechnician = "The customer has cancelled their service booking. Your assigned job card has been cancelled and the inventory has been restocked.";
|
||||||
|
std::string jobTitle = "Job Cancelled";
|
||||||
|
std::string jobMessage = "The job has been cancelled. Your job card has been cancelled and the inventory has been restocked.";
|
||||||
|
processBookingCancellation(booking,
|
||||||
|
util::ServiceJobStatus::CANCELLED,
|
||||||
|
titleToTechnician, messageToTechnician, assignedTechnician,
|
||||||
|
util::ServiceJobStatus::CANCELLED,
|
||||||
|
jobTitle, jobMessage, jobs, *this
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -683,9 +676,7 @@ void ServiceManagementService::cancelTechnicianJobs(const std::string& technicia
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (booking->getStatus() != util::ServiceJobStatus::PENDING &&
|
if (booking->getStatus() != util::ServiceJobStatus::PENDING && booking->getStatus() != util::ServiceJobStatus::STARTED)
|
||||||
booking->getStatus() != util::ServiceJobStatus::STARTED &&
|
|
||||||
booking->getStatus() != util::ServiceJobStatus::IN_PROGRESS)
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -694,7 +685,14 @@ void ServiceManagementService::cancelTechnicianJobs(const std::string& technicia
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
processBookingCancellation(booking, jobs, *this, util::UserType::TECHNICIAN);
|
std::string title = "Technician Unavailable";
|
||||||
|
std::string message = "Your assigned technician is no longer available. Your booking has been reset to pending and we will reassign a new technician shortly.";
|
||||||
|
processBookingCancellation(booking,
|
||||||
|
util::ServiceJobStatus::PENDING,
|
||||||
|
title, message, customer,
|
||||||
|
util::ServiceJobStatus::CANCELLED,
|
||||||
|
title, message, jobs, *this
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1082,7 +1080,7 @@ static bool hasCompletedAllJobs(std::string bookingId, util::Map<std::string, Jo
|
|||||||
JobCard* currentJob = currentAssignedJobs.getValueAt(iterator);
|
JobCard* currentJob = currentAssignedJobs.getValueAt(iterator);
|
||||||
if (currentJob->getBookingId() == bookingId)
|
if (currentJob->getBookingId() == bookingId)
|
||||||
{
|
{
|
||||||
if (currentJob->getStatus() != util::ServiceJobStatus::COMPLETED && currentJob->getStatus() != util::ServiceJobStatus::CANCELLED)
|
if (currentJob->getStatus() == util::ServiceJobStatus::STARTED || currentJob->getStatus() == util::ServiceJobStatus::INPROGRESS)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1092,17 +1090,16 @@ static bool hasCompletedAllJobs(std::string bookingId, util::Map<std::string, Jo
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Function: updateJobStatus
|
Function: completeJob
|
||||||
Description:
|
Description: Marks a job card as completed for the authenticated technician.
|
||||||
Updates the status of a job card assigned to the currently authenticated technician.
|
If all job cards in the booking are completed, marks the booking as completed
|
||||||
- If the job is STARTED, it moves to IN_PROGRESS.
|
and generates an invoice.
|
||||||
- If the job is IN_PROGRESS, it moves to COMPLETED.
|
|
||||||
When all jobs in a service booking are completed, the booking status is updated,
|
|
||||||
an invoice is generated, and a notification is sent to the customer.
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- jobID: const std::string&, unique identifier of the job card to update.
|
- jobID: std::string, ID of the job card
|
||||||
Returns:
|
Returns:
|
||||||
- void
|
- void
|
||||||
|
Throws:
|
||||||
|
- std::runtime_error if technician is not authenticated, job card not found, or job already completed
|
||||||
*/
|
*/
|
||||||
void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
||||||
{
|
{
|
||||||
@@ -1129,10 +1126,10 @@ 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::INPROGRESS);
|
||||||
jobStatusUpdated = true;
|
jobStatusUpdated = true;
|
||||||
}
|
}
|
||||||
else if (currentJob->getStatus() == util::ServiceJobStatus::IN_PROGRESS)
|
else if (currentJob->getStatus() == util::ServiceJobStatus::INPROGRESS)
|
||||||
{
|
{
|
||||||
currentJob->setStatus(util::ServiceJobStatus::COMPLETED);
|
currentJob->setStatus(util::ServiceJobStatus::COMPLETED);
|
||||||
jobStatusUpdated = true;
|
jobStatusUpdated = true;
|
||||||
@@ -1149,10 +1146,12 @@ void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Failed to update job status. Job may already be completed.");
|
throw std::runtime_error("Failed to update the job.");
|
||||||
}
|
}
|
||||||
if (!jobStatusUpdated)
|
if (!jobStatusUpdated)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Failed to update job status. Job may already be completed.");
|
throw std::runtime_error("Failed to update the job");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -29,8 +29,7 @@ namespace util
|
|||||||
enum class PaymentStatus
|
enum class PaymentStatus
|
||||||
{
|
{
|
||||||
PENDING,
|
PENDING,
|
||||||
COMPLETED,
|
COMPLETED
|
||||||
PAID
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class ServiceJobStatus
|
enum class ServiceJobStatus
|
||||||
@@ -38,7 +37,7 @@ namespace util
|
|||||||
PENDING,
|
PENDING,
|
||||||
STARTED,
|
STARTED,
|
||||||
COMPLETED,
|
COMPLETED,
|
||||||
IN_PROGRESS,
|
INPROGRESS,
|
||||||
CANCELLED
|
CANCELLED
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -162,8 +161,6 @@ namespace util
|
|||||||
return "PENDING";
|
return "PENDING";
|
||||||
case PaymentStatus::COMPLETED:
|
case PaymentStatus::COMPLETED:
|
||||||
return "COMPLETED";
|
return "COMPLETED";
|
||||||
case PaymentStatus::PAID:
|
|
||||||
return "PAID";
|
|
||||||
}
|
}
|
||||||
throw std::invalid_argument("Invalid PaymentStatus");
|
throw std::invalid_argument("Invalid PaymentStatus");
|
||||||
}
|
}
|
||||||
@@ -213,8 +210,8 @@ namespace util
|
|||||||
return "COMPLETED";
|
return "COMPLETED";
|
||||||
case ServiceJobStatus::CANCELLED:
|
case ServiceJobStatus::CANCELLED:
|
||||||
return "CANCELLED";
|
return "CANCELLED";
|
||||||
case ServiceJobStatus::IN_PROGRESS:
|
case ServiceJobStatus::INPROGRESS:
|
||||||
return "IN_PROGRESS";
|
return "INPROGRESS";
|
||||||
}
|
}
|
||||||
throw std::invalid_argument("Invalid ServiceJobStatus");
|
throw std::invalid_argument("Invalid ServiceJobStatus");
|
||||||
}
|
}
|
||||||
@@ -247,9 +244,9 @@ namespace util
|
|||||||
{
|
{
|
||||||
return ServiceJobStatus::CANCELLED;
|
return ServiceJobStatus::CANCELLED;
|
||||||
}
|
}
|
||||||
if (value == "IN_PROGRESS")
|
if (value == "INPROGRESS")
|
||||||
{
|
{
|
||||||
return ServiceJobStatus::IN_PROGRESS;
|
return ServiceJobStatus::INPROGRESS;
|
||||||
}
|
}
|
||||||
throw std::invalid_argument("Invalid ServiceJobStatus string");
|
throw std::invalid_argument("Invalid ServiceJobStatus string");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,13 +116,15 @@ bool util::isPasswordValid(const std::string& password)
|
|||||||
* usersMap - map of user objects keyed by identifier
|
* usersMap - map of user objects keyed by identifier
|
||||||
* Returns:
|
* Returns:
|
||||||
* bool - true if the username is already in use by an active user, false otherwise
|
* bool - true if the username is already in use by an active user, false otherwise
|
||||||
|
* Notes:
|
||||||
|
* - Only considers users with state util::State::ACTIVE
|
||||||
*/
|
*/
|
||||||
bool util::isUsernameDuplicate(const std::string& username, const util::Map<std::string, User*>& usersMap)
|
bool util::isUsernameDuplicate(const std::string& username, const util::Map<std::string, User*>& usersMap)
|
||||||
{
|
{
|
||||||
int index = usersMap.findIf(
|
int index = usersMap.findIf(
|
||||||
[&](const std::string&, User* user)
|
[&](const std::string&, User* user)
|
||||||
{
|
{
|
||||||
return (user->getUserName() == username);
|
return (user->getUserName() == username && user->getState() == util::State::ACTIVE);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
return index != -1;
|
return index != -1;
|
||||||
|
|||||||
@@ -53,8 +53,7 @@ void AdminMenu::showMenu()
|
|||||||
<< "\n14. Remove Combo Package"
|
<< "\n14. Remove Combo Package"
|
||||||
<< "\n15. View Notifications"
|
<< "\n15. View Notifications"
|
||||||
<< "\n16. Change Password"
|
<< "\n16. Change Password"
|
||||||
<< "\n17. Confirm Payment"
|
<< "\n17. Logout"
|
||||||
<< "\n18. Logout"
|
|
||||||
<< "\nEnter a choice: ";
|
<< "\nEnter a choice: ";
|
||||||
util::read(choice);
|
util::read(choice);
|
||||||
if (!handleOperation(choice))
|
if (!handleOperation(choice))
|
||||||
@@ -129,9 +128,6 @@ bool AdminMenu::handleOperation(int choice)
|
|||||||
changePassword();
|
changePassword();
|
||||||
break;
|
break;
|
||||||
case 17:
|
case 17:
|
||||||
confirmPayment();
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
logout();
|
logout();
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
@@ -500,54 +496,6 @@ void AdminMenu::displayUsers()
|
|||||||
util::pressEnter();
|
util::pressEnter();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Function: confirmPayment
|
|
||||||
Description: Confirms payment for a selected invoice. Validates invoice status, updates payment date,
|
|
||||||
sets status to COMPLETED, and sends a notification to the customer.
|
|
||||||
Parameters:
|
|
||||||
- invoiceID: std::string, ID of the invoice to confirm
|
|
||||||
Returns:
|
|
||||||
- void
|
|
||||||
*/
|
|
||||||
void AdminMenu::confirmPayment()
|
|
||||||
{
|
|
||||||
util::clear();
|
|
||||||
std::cout << "Confirm Payment\n";
|
|
||||||
auto invoiceList = m_controller.getAllInvoices();
|
|
||||||
if (invoiceList.isEmpty())
|
|
||||||
{
|
|
||||||
std::cout << "No pending invoices available for confirmation.";
|
|
||||||
util::pressEnter();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bool hasConfirmableInvoice = false;
|
|
||||||
for (int index = 0; index < invoiceList.getSize(); ++index)
|
|
||||||
{
|
|
||||||
const Invoice* invoice = invoiceList.getValueAt(index);
|
|
||||||
if (invoice && invoice->getStatus() == util::PaymentStatus::PAID)
|
|
||||||
{
|
|
||||||
hasConfirmableInvoice = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!hasConfirmableInvoice)
|
|
||||||
{
|
|
||||||
std::cout << "No invoices awaiting confirmation.\n";
|
|
||||||
util::pressEnter();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::string selectedID = selectInvoiceFromUserForPayment(invoiceList, util::PaymentStatus::PAID);
|
|
||||||
if (selectedID == "")
|
|
||||||
{
|
|
||||||
std::cout << "Payment failed.\n";
|
|
||||||
util::pressEnter();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_controller.confirmPayment(selectedID);
|
|
||||||
std::cout << "Payment Confirmed successfully.\n";
|
|
||||||
util::pressEnter();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Function: addTechnician
|
Function: addTechnician
|
||||||
Description: Adds a new technician after validating username, password, email, and phone number.
|
Description: Adds a new technician after validating username, password, email, and phone number.
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ public:
|
|||||||
void createService();
|
void createService();
|
||||||
void removeService();
|
void removeService();
|
||||||
void displayUsers();
|
void displayUsers();
|
||||||
void confirmPayment();
|
|
||||||
void addTechnician();
|
void addTechnician();
|
||||||
void removeUser();
|
void removeUser();
|
||||||
void displayComboPackages();
|
void displayComboPackages();
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ void CustomerMenu::completePayments()
|
|||||||
util::pressEnter();
|
util::pressEnter();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::string selectedID = selectInvoiceFromUserForPayment(currentInvoices, util::PaymentStatus::PENDING);
|
std::string selectedID = selectInvoiceFromUserForPayment(currentInvoices);
|
||||||
if (selectedID == "")
|
if (selectedID == "")
|
||||||
{
|
{
|
||||||
std::cout << "Payment failed.\n";
|
std::cout << "Payment failed.\n";
|
||||||
|
|||||||
@@ -365,17 +365,13 @@ inline const User* selectTechnician(util::Map<int, const User*>& currentAvailabl
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Function: selectInvoiceFromUserForPayment
|
Function: selectInvoiceFromUserForPayment
|
||||||
Description: Displays a list of invoices filtered by the required payment status.
|
Description: Lists all pending invoices for the customer and allows selection by index.
|
||||||
Allows the user to select an invoice by index and returns the corresponding invoice ID.
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- currentInvoices: const util::Map<std::string, const Invoice*>&,
|
- currentInvoices: util::Map<std::string, const Invoice*>&, map of customer invoices
|
||||||
map of all invoices keyed by invoice ID
|
|
||||||
- requiredStatus: util::PaymentStatus,
|
|
||||||
the status to filter invoices (e.g., PENDING, PAID, COMPLETED)
|
|
||||||
Returns:
|
Returns:
|
||||||
- std::string: ID of the selected invoice, or empty string if none selected or invalid index
|
- std::string: ID of the selected invoice, or empty string if none selected
|
||||||
*/
|
*/
|
||||||
inline std::string selectInvoiceFromUserForPayment(const util::Map<std::string, const Invoice*>& currentInvoices, util::PaymentStatus requiredStatus)
|
inline std::string selectInvoiceFromUserForPayment(const util::Map<std::string, const Invoice*>& currentInvoices)
|
||||||
{
|
{
|
||||||
int currentIndex = 1, choice;
|
int currentIndex = 1, choice;
|
||||||
util::Map<int, const Invoice*> pendingInvoicesForPayment;
|
util::Map<int, const Invoice*> pendingInvoicesForPayment;
|
||||||
@@ -393,7 +389,7 @@ inline std::string selectInvoiceFromUserForPayment(const util::Map<std::string,
|
|||||||
for (int iterator = 0; iterator < currentInvoices.getSize(); iterator++)
|
for (int iterator = 0; iterator < currentInvoices.getSize(); iterator++)
|
||||||
{
|
{
|
||||||
const Invoice* currentInvoice = currentInvoices.getValueAt(iterator);
|
const Invoice* currentInvoice = currentInvoices.getValueAt(iterator);
|
||||||
if (currentInvoice && currentInvoice->getStatus() == requiredStatus)
|
if (currentInvoice && currentInvoice->getStatus() == util::PaymentStatus::PENDING)
|
||||||
{
|
{
|
||||||
const User* currentTechnician = currentInvoice->getBooking()->getAssignedTechnician();
|
const User* currentTechnician = currentInvoice->getBooking()->getAssignedTechnician();
|
||||||
std::cout << std::left
|
std::cout << std::left
|
||||||
@@ -631,6 +627,7 @@ inline void displayInvoices(util::Map<std::string, const Invoice*> currentUserIn
|
|||||||
std::cout << "Unable to fetch the selected invoice\n";
|
std::cout << "Unable to fetch the selected invoice\n";
|
||||||
doRun = false;
|
doRun = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (doRun);
|
} while (doRun);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -649,7 +646,7 @@ inline util::Map<std::string, const JobCard*> filterStartedJobCards(util::Map<st
|
|||||||
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
|
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
|
||||||
{
|
{
|
||||||
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
|
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
|
||||||
if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED || currentJobCard->getStatus() == util::ServiceJobStatus::IN_PROGRESS))
|
if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED || currentJobCard->getStatus() == util::ServiceJobStatus::INPROGRESS))
|
||||||
{
|
{
|
||||||
startedJobCards.insert(currentJobCard->getId(), currentJobCard);
|
startedJobCards.insert(currentJobCard->getId(), currentJobCard);
|
||||||
}
|
}
|
||||||
@@ -662,11 +659,13 @@ Function: filterJobCards
|
|||||||
Description:
|
Description:
|
||||||
Filters the given list of job cards and returns only those
|
Filters the given list of job cards and returns only those
|
||||||
whose status matches the specified ServiceJobStatus.
|
whose status matches the specified ServiceJobStatus.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- assignedJobCards: util::Map<std::string, const JobCard*>&
|
- assignedJobCards: util::Map<std::string, const JobCard*>&
|
||||||
Map of job card IDs to JobCard pointers assigned to the technician.
|
Map of job card IDs to JobCard pointers assigned to the technician.
|
||||||
- selectedJobStatus: util::ServiceJobStatus
|
- selectedJobStatus: util::ServiceJobStatus
|
||||||
The status type to filter job cards by.
|
The status type to filter job cards by.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
- util::Map<std::string, const JobCard*>
|
- util::Map<std::string, const JobCard*>
|
||||||
A map containing only job cards with the specified status.
|
A map containing only job cards with the specified status.
|
||||||
@@ -711,7 +710,7 @@ inline void displayAllJobs(util::Map<std::string, const JobCard*>& assignedJobCa
|
|||||||
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
|
for (int iterator = 0; iterator < assignedJobCards.getSize(); iterator++)
|
||||||
{
|
{
|
||||||
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
|
const JobCard* currentJobCard = assignedJobCards.getValueAt(iterator);
|
||||||
if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED || currentJobCard->getStatus() == util::ServiceJobStatus::IN_PROGRESS))
|
if (currentJobCard && (currentJobCard->getStatus() == util::ServiceJobStatus::STARTED || currentJobCard->getStatus() == util::ServiceJobStatus::INPROGRESS))
|
||||||
{
|
{
|
||||||
std::cout << std::left << std::setw(12) << currentJobCard->getBookingId()
|
std::cout << std::left << std::setw(12) << currentJobCard->getBookingId()
|
||||||
<< std::setw(12) << currentJobCard->getId()
|
<< std::setw(12) << currentJobCard->getId()
|
||||||
@@ -736,7 +735,7 @@ inline std::string selectJobCardToUpdate(util::Map<std::string, const JobCard*>&
|
|||||||
util::Map<int, const JobCard* > incompleteJobCards;
|
util::Map<int, const JobCard* > incompleteJobCards;
|
||||||
if (assignedJobCards.getSize() == 0)
|
if (assignedJobCards.getSize() == 0)
|
||||||
{
|
{
|
||||||
std::cout << "\nNo jobs available.\n\n";
|
std::cout << "No jobs available.\n\n";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
int currentIndex = 1;
|
int currentIndex = 1;
|
||||||
@@ -744,12 +743,12 @@ inline std::string selectJobCardToUpdate(util::Map<std::string, const JobCard*>&
|
|||||||
if (selectedJobStatusType == util::ServiceJobStatus::STARTED)
|
if (selectedJobStatusType == util::ServiceJobStatus::STARTED)
|
||||||
{
|
{
|
||||||
util::clear();
|
util::clear();
|
||||||
std::cout << "Select a job to mark as In Progress\n";
|
std::cout << "Select a job to update to Inprogress\n";
|
||||||
}
|
}
|
||||||
else if (selectedJobStatusType == util::ServiceJobStatus::IN_PROGRESS)
|
else if (selectedJobStatusType == util::ServiceJobStatus::INPROGRESS)
|
||||||
{
|
{
|
||||||
util::clear();
|
util::clear();
|
||||||
std::cout << "Select a job to mark as Completed\n";
|
std::cout << "Select a job to update to Completed\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -780,7 +779,7 @@ inline std::string selectJobCardToUpdate(util::Map<std::string, const JobCard*>&
|
|||||||
incompleteJobCards.insert(currentIndex++, currentJobCard);
|
incompleteJobCards.insert(currentIndex++, currentJobCard);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cout << "Enter the job index to update: ";
|
std::cout << "Select the Job Card to Update (Index): ";
|
||||||
util::read(choice);
|
util::read(choice);
|
||||||
int selectedJobCardIndex = incompleteJobCards.find(choice);
|
int selectedJobCardIndex = incompleteJobCards.find(choice);
|
||||||
if (selectedJobCardIndex != -1)
|
if (selectedJobCardIndex != -1)
|
||||||
|
|||||||
@@ -119,9 +119,9 @@ void TechnicianMenu::updateJobStatus()
|
|||||||
std::cout << "Update Job Status\n";
|
std::cout << "Update Job Status\n";
|
||||||
int choice;
|
int choice;
|
||||||
std::string selectedJobID;
|
std::string selectedJobID;
|
||||||
util::ServiceJobStatus selectedJobStatus = util::ServiceJobStatus::PENDING;
|
util::ServiceJobStatus selectedJobStatus;
|
||||||
util::Map<std::string, const JobCard*> assignedJobCards = m_controller.getJobCardsByUser();
|
util::Map<std::string, const JobCard*> assignedJobCards = m_controller.getJobCardsByUser();
|
||||||
std::cout << "Select the type of job you want to update:\n1.Started\n2.In Progress\nChoice: ";
|
std::cout << "Select the type of job you want to update\n1.Started\n2.Inprogress\nChoice: ";
|
||||||
util::read(choice);
|
util::read(choice);
|
||||||
if (choice == 1)
|
if (choice == 1)
|
||||||
{
|
{
|
||||||
@@ -129,13 +129,11 @@ void TechnicianMenu::updateJobStatus()
|
|||||||
}
|
}
|
||||||
else if (choice == 2)
|
else if (choice == 2)
|
||||||
{
|
{
|
||||||
selectedJobStatus = util::ServiceJobStatus::IN_PROGRESS;
|
selectedJobStatus = util::ServiceJobStatus::INPROGRESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::cout << "Invalid choice. Please try again.\n";
|
throw std::runtime_error("Invalid Index");
|
||||||
util::pressEnter();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
util::Map<std::string, const JobCard*> selectedTypeJobCard = filterJobCards(assignedJobCards, selectedJobStatus);
|
util::Map<std::string, const JobCard*> selectedTypeJobCard = filterJobCards(assignedJobCards, selectedJobStatus);
|
||||||
selectedJobID = selectJobCardToUpdate(selectedTypeJobCard, selectedJobStatus);
|
selectedJobID = selectJobCardToUpdate(selectedTypeJobCard, selectedJobStatus);
|
||||||
|
|||||||
Reference in New Issue
Block a user