Refactor delivery and order handling: unique IDs, status methods, new fields, naming fixes, and menu/controller corrections

- Add static m_uid to DeliveryAssignment for unique IDs
    - Implement DeliveryAssignment getStatus() and setStatus()
    - Add DeliveryPartner::getAssignedDeliveries()
    - Rename pickOrderFromOrders() param to userOrders
    - Fix spelling issues and setw() widths
    - Mark non-mutating controller methods as const
    - Add newline before Net Cost output
    - Restrict cancellation to orders in CREATED state
    - Add customerUsername to Order with getters/setters
    - Implement Restaurant::addOrder()
    - Fix RestaurantOwnerMenu option 5
This commit is contained in:
Joel Thomas
2026-02-21 13:21:26 +05:30
parent 08cdab9e43
commit 813f236172
10 changed files with 59 additions and 25 deletions
@@ -5,11 +5,23 @@ Date: 18-02-2026
#include "DeliveryAssignment.h"
int DeliveryAssignment::m_uid = 0;
int DeliveryAssignment::getId() const
{
return m_id;
}
DeliveryStatus DeliveryAssignment::getStatus() const
{
return m_status;
}
void DeliveryAssignment::setStatus(const DeliveryStatus& status)
{
m_status = status;
}
Order& DeliveryAssignment::getOrder()
{
return m_order;
@@ -16,17 +16,19 @@ enum class DeliveryStatus
class DeliveryAssignment
{
private:
static int m_uid;
int m_id;
Order& m_order;
DeliveryStatus m_status;
public:
DeliveryAssignment(int id, Order& order) :
m_id(id),
DeliveryAssignment(Order& order) :
m_id(++m_uid),
m_order(order),
m_status(DeliveryStatus::CREATED)
{}
int getId() const;
DeliveryStatus getStatus() const;
void setStatus(const DeliveryStatus&);
Order& getOrder();
};
@@ -10,6 +10,11 @@ void DeliveryPartner::acceptDeliveryAssignment(std::shared_ptr<DeliveryAssignmen
m_deliveryAssignments[deliveryAssignmentPointer->getId()] = deliveryAssignmentPointer;
}
deliveryAssignments& DeliveryPartner::getAssignedDeliveries()
{
return m_deliveryAssignments;
}
std::string DeliveryPartner::getType() const
{
return "DeliveryPartner";
@@ -123,27 +123,27 @@ static std::string getOrderStatusString(const OrderStatus& orderStatus)
}
}
static orders::iterator pickOrderFromOrders(orders& customerOrders)
static orders::iterator pickOrderFromOrders(orders& userOrders)
{
util::clear();
std::cout << "Pick an order\n";
std::cout << "Pick an Order\n";
int orderIndex = 1, orderChoiceIndex;
if (customerOrders.empty())
if (userOrders.empty())
{
std::cout << "You have not placed any orders!\n";
return customerOrders.end();
return userOrders.end();
}
std::cout << std::left << std::setw(8) << "Index"
<< std::left << std::setw(5) << "ID"
<< std::left << std::setw(15) << "Item Count"
<< std::left << std::setw(12) << "Item Count"
<< std::left << std::setw(15) << "Total Amount"
<< std::left << std::setw(15) << "Status"
<< "\n";
for (auto& order : customerOrders)
for (auto& order : userOrders)
{
std::cout << std::left << std::setw(8) << orderIndex
<< std::left << std::setw(5) << order.second->getId()
<< std::left << std::setw(15) << order.second->getItems().size()
<< std::left << std::setw(12) << order.second->getItems().size()
<< std::left << std::setw(15) << order.second->getTotal()
<< std::left << std::setw(15) << getOrderStatusString(order.second->getStatus())
<< "\n";
@@ -152,11 +152,11 @@ static orders::iterator pickOrderFromOrders(orders& customerOrders)
std::cout << "\nSelect Index: ";
util::readValue<int>(orderChoiceIndex);
orderChoiceIndex--;
if (orderChoiceIndex < 0 || orderChoiceIndex >= customerOrders.size())
if (orderChoiceIndex < 0 || orderChoiceIndex >= userOrders.size())
{
return customerOrders.end();
return userOrders.end();
}
orders::iterator orderIterator = customerOrders.begin();
orders::iterator orderIterator = userOrders.begin();
std::advance(orderIterator, orderChoiceIndex);
return orderIterator;
}
@@ -391,7 +391,7 @@ void FoodDeliveryController::updateRestaurantStatus() const
}
}
void FoodDeliveryController::listRestaurantOrders()
void FoodDeliveryController::listRestaurantOrders() const
{
}
@@ -567,7 +567,7 @@ void FoodDeliveryController::listCustomerOrders() const
<< std::left << std::setw(10) << menuItem.getPrice() * item->getQuantity()
<< "\n";
}
std::cout << "Net Cost : " << orderIterator->second->getTotal() << "\n";
std::cout << "\nNet Cost : " << orderIterator->second->getTotal() << "\n";
std::cout << "Status : " << getOrderStatusString(orderIterator->second->getStatus()) << "\n";
}
else if (!customerOrders.empty())
@@ -626,7 +626,7 @@ void FoodDeliveryController::placeOrder()
{
if (!order)
{
order = std::make_shared<Order>();
order = std::make_shared<Order>(customer->getName());
}
order->addItem(Item(*(menuItemIterator->second), quantity));
std::cout << menuItemIterator->second->getName() << " with quantity " << quantity << " has been added to your Order\n";
@@ -694,17 +694,14 @@ void FoodDeliveryController::cancelOrder() const
if (orderIterator != customerOrders.end())
{
OrderStatus orderStatus = orderIterator->second->getStatus();
if (orderStatus != OrderStatus::CANCELLED && orderStatus != OrderStatus::DELIVERED) {
if (orderStatus == OrderStatus::CREATED)
{
orderIterator->second->setStatus(OrderStatus::CANCELLED);
std::cout << "Order " << orderIterator->second->getId() << " has been cancelled successfully!\n";
}
else if (orderStatus == OrderStatus::DELIVERED)
{
std::cout << "Cannot cancel Order " << orderIterator->second->getId() << " as it has already been delivered!\n";
}
else
{
std::cout << "Order " << orderIterator->second->getId() << " has already been cancelled!\n";
std::cout << "Order " << orderIterator->second->getId() << " cannot be cancelled as it is already cancelled, ready for pickup, in transit, or delivered!\n";
}
}
else if (!customerOrders.empty())
@@ -35,7 +35,7 @@ public:
void listRestaurants() const;
void addNewRestaurant();
void updateRestaurantStatus() const;
void listRestaurantOrders();
void listRestaurantOrders() const;
void markOrderReady();
void listMenuItems() const;
void addMenuItem() const;
@@ -36,3 +36,8 @@ void Order::setStatus(const OrderStatus& orderStatus)
{
m_status = orderStatus;
}
const std::string& Order::getCustomerUsername()
{
return m_customerUsername;
}
@@ -5,6 +5,7 @@ Date: 18-12-2026
#pragma once
#include <vector>
#include <string>
#include <memory>
#include "Item.h"
@@ -27,11 +28,13 @@ private:
items m_items;
double m_totalAmount;
OrderStatus m_status;
std::string m_customerUsername;
public:
Order():
Order(const std::string& customerUsername) :
m_id(++m_uid),
m_totalAmount(0),
m_status(OrderStatus::CREATED)
m_status(OrderStatus::CREATED),
m_customerUsername(customerUsername)
{}
int getId() const;
void addItem(const Item&);
@@ -39,5 +42,6 @@ public:
double getTotal() const;
OrderStatus getStatus() const;
void setStatus(const OrderStatus&);
const std::string& getCustomerUsername();
};
@@ -35,6 +35,14 @@ orders& Restaurant::getOrders()
return m_orders;
}
void Restaurant::addOrder(std::shared_ptr<Order> order)
{
if (m_orders.find(order->getId()) == m_orders.end())
{
m_orders[order->getId()] = order;
}
}
bool Restaurant::getStatus() const
{
return m_isOpen;
@@ -38,6 +38,7 @@ public:
menuItems& getMenuItems();
const std::string& getName() const;
orders& getOrders();
void addOrder(std::shared_ptr<Order>);
bool getStatus() const;
void setStatus(bool);
};
@@ -24,7 +24,7 @@ void RestaurantOwnerMenu::showMenu()
"2. Add New Restaurant\n"
"3. Update Restaurant Status\n"
"4. List Orders\n"
"5. Mark Order Ready for Delivery\n"
"5. Mark Order Ready for PickUp\n"
"6. List Menu Items\n"
"7. Add New Item to Menu\n"
"8. Remove Item from Menu\n"