Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 714067f309 | |||
| 05b9fc7962 | |||
| 956ef58c79 | |||
| 32f1fa33ce | |||
| 684d6d3860 | |||
| 976547e7d1 | |||
| bdb8431773 | |||
| 2eaa719aca | |||
| 8a3ec278ce |
+21
-11
@@ -629,6 +629,7 @@ void ServiceManagementService::createJobCard(const std::string& bookingID, const
|
|||||||
DataStoreLockGuard lock(m_dataStore);
|
DataStoreLockGuard lock(m_dataStore);
|
||||||
UserManagementService m_userManagementService;
|
UserManagementService m_userManagementService;
|
||||||
ServiceBooking* currentBooking = getServiceBooking(bookingID);
|
ServiceBooking* currentBooking = getServiceBooking(bookingID);
|
||||||
|
std::string title, message;
|
||||||
if (currentBooking == nullptr)
|
if (currentBooking == nullptr)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Service Booking not available");
|
throw std::runtime_error("Service Booking not available");
|
||||||
@@ -684,18 +685,30 @@ void ServiceManagementService::createJobCard(const std::string& bookingID, const
|
|||||||
trackedCurrentInventoryItem.state = RecordState::MODIFIED;
|
trackedCurrentInventoryItem.state = RecordState::MODIFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
currentBooking->setAssignedTechnician(selectedTechnician);
|
const User* currentAssignedTechnician = currentBooking->getAssignedTechnician();
|
||||||
currentBooking->setAssignedTechnicianId(selectedTechnician->getId());
|
const std::string& currentAssignedTechnicianId = currentBooking->getAssignedTechnicianId();
|
||||||
|
if (!currentAssignedTechnician && currentAssignedTechnicianId.empty())
|
||||||
|
{
|
||||||
|
currentBooking->setAssignedTechnician(selectedTechnician);
|
||||||
|
currentBooking->setAssignedTechnicianId(selectedTechnician->getId());
|
||||||
|
title = "Technician assigned";
|
||||||
|
message = "A technician has been assigned to your Service Booking with ID " + bookingID;
|
||||||
|
sendNotification(currentBooking->getCustomer(), title, message);
|
||||||
|
}
|
||||||
|
|
||||||
if (currentBooking->getStatus() == util::ServiceJobStatus::PENDING)
|
if (currentBooking->getStatus() == util::ServiceJobStatus::PENDING)
|
||||||
{
|
{
|
||||||
currentBooking->setStatus(util::ServiceJobStatus::STARTED);
|
currentBooking->setStatus(util::ServiceJobStatus::STARTED);
|
||||||
}
|
}
|
||||||
currentTrackedServiceBooking.state = RecordState::MODIFIED;
|
currentTrackedServiceBooking.state = RecordState::MODIFIED;
|
||||||
std::string title = "Job card created";
|
|
||||||
std::string message = "Job card created for the service and you are assigned for that.";
|
|
||||||
JobCard* jobCard = Factory::getObject<JobCard>(bookingID, currentBooking, currentService, serviceID, technicianID, selectedTechnician, util::Timestamp(), util::ServiceJobStatus::STARTED, util::Timestamp());
|
JobCard* jobCard = Factory::getObject<JobCard>(bookingID, currentBooking, currentService, serviceID, technicianID, selectedTechnician, util::Timestamp(), util::ServiceJobStatus::STARTED, util::Timestamp());
|
||||||
if (jobCard)
|
if (jobCard)
|
||||||
{
|
{
|
||||||
|
title = "Job Card Assigned";
|
||||||
|
message = "A new Job Card (ID: " + jobCard->getId() +
|
||||||
|
") has been created for Service " + serviceID +
|
||||||
|
" in Booking " + bookingID +
|
||||||
|
". You have been assigned to this job.";
|
||||||
currentTrackedJobCards.insert(jobCard->getId(), util::createNewRecord(jobCard));
|
currentTrackedJobCards.insert(jobCard->getId(), util::createNewRecord(jobCard));
|
||||||
sendNotification(selectedTechnician, title, message);
|
sendNotification(selectedTechnician, title, message);
|
||||||
}
|
}
|
||||||
@@ -703,9 +716,6 @@ void ServiceManagementService::createJobCard(const std::string& bookingID, const
|
|||||||
{
|
{
|
||||||
throw std::runtime_error("Failed to create job card.");
|
throw std::runtime_error("Failed to create job card.");
|
||||||
}
|
}
|
||||||
title = "Technician assigned";
|
|
||||||
message = "A technician has been assigned to your Service Booking with ID " + bookingID;
|
|
||||||
sendNotification(currentBooking->getCustomer(), title, message);
|
|
||||||
m_dataStore.saveJobCards();
|
m_dataStore.saveJobCards();
|
||||||
m_dataStore.saveServiceBookings();
|
m_dataStore.saveServiceBookings();
|
||||||
m_dataStore.saveInventoryItems();
|
m_dataStore.saveInventoryItems();
|
||||||
@@ -852,8 +862,8 @@ void ServiceManagementService::removeServiceBooking(const std::string& bookingID
|
|||||||
{
|
{
|
||||||
if (currentServiceBooking->getStatus() == util::ServiceJobStatus::PENDING)
|
if (currentServiceBooking->getStatus() == util::ServiceJobStatus::PENDING)
|
||||||
{
|
{
|
||||||
const std::string title = "Service Booking cancelled.";
|
const std::string title = "Service Booking Cancelled";
|
||||||
const std::string message = "Service Booking of id " + bookingID + " successfully cancelled.";
|
const std::string message = "Service Booking (ID: " + bookingID + ") has been successfully cancelled";
|
||||||
currentServiceBooking->setStatus(util::ServiceJobStatus::CANCELLED);
|
currentServiceBooking->setStatus(util::ServiceJobStatus::CANCELLED);
|
||||||
currentTrackedServiceBooking.state = RecordState::MODIFIED;
|
currentTrackedServiceBooking.state = RecordState::MODIFIED;
|
||||||
serviceBookingRemoved = true;
|
serviceBookingRemoved = true;
|
||||||
@@ -1025,8 +1035,8 @@ void ServiceManagementService::updateJobStatus(const std::string& jobID)
|
|||||||
currentJob->getBooking()->setStatus(util::ServiceJobStatus::COMPLETED);
|
currentJob->getBooking()->setStatus(util::ServiceJobStatus::COMPLETED);
|
||||||
trackedServiceBookings.getValueAt(trackedServiceBookings.find(bookingId)).state = RecordState::MODIFIED;
|
trackedServiceBookings.getValueAt(trackedServiceBookings.find(bookingId)).state = RecordState::MODIFIED;
|
||||||
paymentManagementService.generateInvoice(currentJob->getBooking());
|
paymentManagementService.generateInvoice(currentJob->getBooking());
|
||||||
std::string title = "Service Booking completed. Invoice Generated.";
|
std::string title = "Service Booking Completed";
|
||||||
std::string message = "Services completed for the booking and invoice generated.";
|
std::string message = "Service Booking (ID: " + bookingId + ") has been completed successfully. An invoice has been generated.";
|
||||||
sendNotification(currentJob->getBooking()->getCustomer(), title, message);
|
sendNotification(currentJob->getBooking()->getCustomer(), title, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,6 +220,13 @@ void CustomerMenu::selectService()
|
|||||||
util::pressEnter();
|
util::pressEnter();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!verifyAllPaymentsCompleted(m_controller))
|
||||||
|
{
|
||||||
|
std::cout << "Your booking cannot be processed because you have pending payments for previous services. Please complete all outstanding invoices before booking a new service."
|
||||||
|
<< std::endl;
|
||||||
|
util::pressEnter();
|
||||||
|
return;
|
||||||
|
}
|
||||||
util::Vector<std::string> selectedServices;
|
util::Vector<std::string> selectedServices;
|
||||||
const Service* selectedService = selectServiceFromServices(services);
|
const Service* selectedService = selectServiceFromServices(services);
|
||||||
if (selectedService == nullptr)
|
if (selectedService == nullptr)
|
||||||
@@ -262,6 +269,13 @@ void CustomerMenu::selectComboPackage()
|
|||||||
util::pressEnter();
|
util::pressEnter();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!verifyAllPaymentsCompleted(m_controller))
|
||||||
|
{
|
||||||
|
std::cout << "Your booking cannot be processed because you have pending payments for previous services. Please complete all outstanding invoices before booking a new combo package."
|
||||||
|
<< std::endl;
|
||||||
|
util::pressEnter();
|
||||||
|
return;
|
||||||
|
}
|
||||||
const ComboPackage* selectedComboPackage = selectComboPackageFromPackages(activeComboPackages);
|
const ComboPackage* selectedComboPackage = selectComboPackageFromPackages(activeComboPackages);
|
||||||
if (selectedComboPackage == nullptr)
|
if (selectedComboPackage == nullptr)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1471,3 +1471,45 @@ inline void displayNewNotification(util::Vector<const Notification*> notificatio
|
|||||||
MB_ICONINFORMATION);
|
MB_ICONINFORMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: verifyAllPaymentsCompleted
|
||||||
|
Description: Checks whether the authenticated customer has completed
|
||||||
|
all payments for their invoices. Iterates through all
|
||||||
|
invoices belonging to the customer and verifies that
|
||||||
|
each invoice has a payment status of COMPLETED.
|
||||||
|
Parameters: Controller& m_controller -
|
||||||
|
reference to the Controller object used to access
|
||||||
|
authenticated user and invoice data
|
||||||
|
Return type: bool
|
||||||
|
true if all invoices for the authenticated customer
|
||||||
|
are completed, false if any invoice is pending or not completed
|
||||||
|
Throws: std::runtime_error if no authenticated user is found
|
||||||
|
*/
|
||||||
|
inline bool verifyAllPaymentsCompleted(Controller& m_controller)
|
||||||
|
{
|
||||||
|
const User* authenticatedUser = m_controller.getAuthenticatedUser();
|
||||||
|
if (!authenticatedUser)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("No authenticated user found.");
|
||||||
|
}
|
||||||
|
const std::string& authenticatedUserId = authenticatedUser->getId();
|
||||||
|
util::Map<std::string, const Invoice*> listOfInvoices = m_controller.getAllInvoices();
|
||||||
|
for (int invoiceIndex = 0; invoiceIndex < listOfInvoices.getSize(); ++invoiceIndex)
|
||||||
|
{
|
||||||
|
const Invoice* invoice = listOfInvoices.getValueAt(invoiceIndex);
|
||||||
|
if (!invoice)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const std::string& customerId = invoice->getBooking()->getCustomerId();
|
||||||
|
if (customerId == authenticatedUserId)
|
||||||
|
{
|
||||||
|
if (invoice->getStatus() != util::PaymentStatus::COMPLETED)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user