91 lines
2.1 KiB
C++
91 lines
2.1 KiB
C++
#include <stdexcept>
|
|
#include "PaymentManagementService.h"
|
|
#include "Invoice.h"
|
|
#include "ServiceBooking.h"
|
|
#include "Enums.h"
|
|
#include "Timestamp.h"
|
|
#include "Config.h"
|
|
#include "User.h"
|
|
#include "Factory.h"
|
|
|
|
util::Map<std::string, User*> PaymentManagementService::m_observers{};
|
|
|
|
void PaymentManagementService::attach(User* user)
|
|
{
|
|
if (user)
|
|
{
|
|
const std::string& userID = user->getId();
|
|
if (m_observers.find(userID) == -1)
|
|
{
|
|
m_observers[userID] = user;
|
|
}
|
|
}
|
|
}
|
|
|
|
void PaymentManagementService::detach(User* user)
|
|
{
|
|
if (user)
|
|
{
|
|
const std::string& userID = user->getId();
|
|
if (m_observers.find(userID) != -1)
|
|
{
|
|
m_observers.remove(userID);
|
|
}
|
|
}
|
|
}
|
|
|
|
void PaymentManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
|
|
{
|
|
if (user)
|
|
{
|
|
if (m_observers.find(user->getId()) != -1)
|
|
{
|
|
Notification* notification =
|
|
Factory::getObject<Notification>(
|
|
user->getId(),
|
|
user,
|
|
"PaymentManagementService: " + title,
|
|
message,
|
|
util::Timestamp()
|
|
);
|
|
if (notification)
|
|
{
|
|
user->addNotification(notification);
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error("Failed to create notification");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void PaymentManagementService::sendPaymentReminders()
|
|
{
|
|
auto& invoicesMap = m_dataStore.getInvoices();
|
|
int invoicesMapSize = invoicesMap.getSize();
|
|
for (int index = 0; index < invoicesMapSize; index++)
|
|
{
|
|
const Invoice* invoice = invoicesMap.getValueAt(index);
|
|
if (invoice && invoice->getStatus() == util::PaymentStatus::PENDING)
|
|
{
|
|
util::Timestamp invoiceCreationTimestamp = invoice->getInvoiceDate();
|
|
util::Timestamp currentTimestamp;
|
|
if (util::Timestamp::getDurationInHours(invoiceCreationTimestamp, currentTimestamp) >= config::threshold::PAYMENT_REMINDER_THRESHOLD_HOURS)
|
|
{
|
|
const ServiceBooking* serviceBooking = invoice->getBooking();
|
|
if (serviceBooking)
|
|
{
|
|
User* customer = serviceBooking->getCustomer();
|
|
if (customer)
|
|
{
|
|
sendNotification(customer,
|
|
"Payment Reminder",
|
|
"Your payment for Invoice ID " + invoice->getId() + " is still pending.Please complete the payment." + invoice->getId());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|