94 lines
3.9 KiB
C++
94 lines
3.9 KiB
C++
#include "PaymentManagementService.h"
|
|
#include "ServiceBooking.h"
|
|
#include "Service.h"
|
|
#include "InventoryItem.h"
|
|
#include "Utility.h"
|
|
#include "Factory.h"
|
|
#include "Timestamp.h"
|
|
#include "Invoice.h"
|
|
#include "JobCard.h"
|
|
#include "Enums.h"
|
|
|
|
static void createInventoryItemsMap(util::Map<std::string, InventoryItem*>& completeInventoryItemMapOfBooking, const Service* currentService)
|
|
{
|
|
auto& currentRequiredInventoryItems = currentService->getRequiredInventoryItems();
|
|
for (int iterator = 0; iterator < currentRequiredInventoryItems.getSize(); iterator++)
|
|
{
|
|
auto& currentRequiredInventoryItem = currentRequiredInventoryItems.getValueAt(iterator);
|
|
completeInventoryItemMapOfBooking.insert(currentRequiredInventoryItem->getId(), currentRequiredInventoryItem);
|
|
}
|
|
}
|
|
|
|
void PaymentManagementService::generateInvoice(ServiceBooking* booking)
|
|
{
|
|
if (!booking)
|
|
{
|
|
throw std::runtime_error("Invoice generation failed: booking is null.");
|
|
}
|
|
double totalLabourCost = 0, totalPartsCost = 0, totalServiceCost = 0;
|
|
double discountPercentage = booking->getDiscountPercentage();
|
|
std::string bookingID = booking->getId();
|
|
util::Map<std::string, Service*> servicesInTheBookedService = booking->getServices();
|
|
util::Map<std::string, InventoryItem*> completeInventoryItemMapOfBooking;
|
|
util::Map<std::string, JobCard*> currentJobCards = m_dataStore.getJobCards();
|
|
for (int iterator = 0; iterator < currentJobCards.getSize(); iterator++)
|
|
{
|
|
JobCard* currentJobCard = currentJobCards.getValueAt(iterator);
|
|
if (currentJobCard->getBookingId() == bookingID && currentJobCard->getStatus() != util::ServiceJobStatus::COMPLETED)
|
|
{
|
|
throw std::runtime_error("Invoice generation failed: not all job cards are completed for booking '" + bookingID + "'.");
|
|
}
|
|
}
|
|
for (int iterator = 0; iterator < servicesInTheBookedService.getSize(); iterator++)
|
|
{
|
|
Service* currentService = servicesInTheBookedService.getValueAt(iterator);
|
|
if (currentService)
|
|
{
|
|
createInventoryItemsMap(completeInventoryItemMapOfBooking, currentService);
|
|
totalLabourCost += currentService->getLaborCost();
|
|
totalPartsCost += calculatePartsCost(currentService);
|
|
}
|
|
}
|
|
totalServiceCost = totalLabourCost + totalPartsCost;
|
|
totalServiceCost -= (totalServiceCost * (discountPercentage / 100));
|
|
Invoice* invoice = Factory::getObject<Invoice>(bookingID, booking, util::Timestamp(), totalLabourCost, completeInventoryItemMapOfBooking, totalPartsCost, discountPercentage, totalServiceCost, util::Timestamp(), util::PaymentMode::NOTSET, util::PaymentStatus::PENDING);
|
|
util::Map<std::string, Invoice*>& currentInvoices = m_dataStore.getInvoices();
|
|
currentInvoices.insert(invoice->getId(), invoice);
|
|
}
|
|
|
|
util::Map<std::string, Invoice*> PaymentManagementService::getInvoices(const std::string& customerID)
|
|
{
|
|
util::Map<std::string, Invoice*>& currentInvoices = m_dataStore.getInvoices();
|
|
util::Map<std::string, Invoice*> currentUserInvoices;
|
|
for (int iterator = 0; iterator < currentInvoices.getSize(); iterator++)
|
|
{
|
|
Invoice* currentInvoice = currentInvoices.getValueAt(iterator);
|
|
if (currentInvoice->getBooking()->getCustomerId() == customerID)
|
|
{
|
|
currentUserInvoices.insert(currentInvoice->getId(), currentInvoice);
|
|
}
|
|
}
|
|
return currentUserInvoices;
|
|
}
|
|
|
|
void PaymentManagementService::completePayment(const std::string& invoiceID, util::PaymentMode paymentMode)
|
|
{
|
|
auto& currentInvoices = m_dataStore.getInvoices();
|
|
int invoiceIndex = currentInvoices.find(invoiceID);
|
|
if (invoiceIndex != -1)
|
|
{
|
|
Invoice* invoice = currentInvoices.getValueAt(invoiceIndex);
|
|
User* currentUser = invoice->getBooking()->getCustomer();
|
|
invoice->setPaymentMethod(paymentMode);
|
|
invoice->setPaymentDate(util::Timestamp());
|
|
invoice->setStatus(util::PaymentStatus::COMPLETED);
|
|
std::string title, message;
|
|
title = "Payment successful";
|
|
message = "Payment successful for invoice ID " + invoiceID;
|
|
sendNotification(currentUser, title, message);
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error("Payment failed: invalid invoice ID.");
|
|
}
|
|
} |