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" #include "DeliveryAssignment.h"
int DeliveryAssignment::m_uid = 0;
int DeliveryAssignment::getId() const int DeliveryAssignment::getId() const
{ {
return m_id; return m_id;
} }
DeliveryStatus DeliveryAssignment::getStatus() const
{
return m_status;
}
void DeliveryAssignment::setStatus(const DeliveryStatus& status)
{
m_status = status;
}
Order& DeliveryAssignment::getOrder() Order& DeliveryAssignment::getOrder()
{ {
return m_order; return m_order;
@@ -16,17 +16,19 @@ enum class DeliveryStatus
class DeliveryAssignment class DeliveryAssignment
{ {
private: private:
static int m_uid;
int m_id; int m_id;
Order& m_order; Order& m_order;
DeliveryStatus m_status; DeliveryStatus m_status;
public: public:
DeliveryAssignment(int id, Order& order) : DeliveryAssignment(Order& order) :
m_id(id), m_id(++m_uid),
m_order(order), m_order(order),
m_status(DeliveryStatus::CREATED) m_status(DeliveryStatus::CREATED)
{} {}
int getId() const; int getId() const;
DeliveryStatus getStatus() const; DeliveryStatus getStatus() const;
void setStatus(const DeliveryStatus&);
Order& getOrder(); Order& getOrder();
}; };
@@ -10,6 +10,11 @@ void DeliveryPartner::acceptDeliveryAssignment(std::shared_ptr<DeliveryAssignmen
m_deliveryAssignments[deliveryAssignmentPointer->getId()] = deliveryAssignmentPointer; m_deliveryAssignments[deliveryAssignmentPointer->getId()] = deliveryAssignmentPointer;
} }
deliveryAssignments& DeliveryPartner::getAssignedDeliveries()
{
return m_deliveryAssignments;
}
std::string DeliveryPartner::getType() const std::string DeliveryPartner::getType() const
{ {
return "DeliveryPartner"; 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(); util::clear();
std::cout << "Pick an order\n"; std::cout << "Pick an Order\n";
int orderIndex = 1, orderChoiceIndex; int orderIndex = 1, orderChoiceIndex;
if (customerOrders.empty()) if (userOrders.empty())
{ {
std::cout << "You have not placed any orders!\n"; std::cout << "You have not placed any orders!\n";
return customerOrders.end(); return userOrders.end();
} }
std::cout << std::left << std::setw(8) << "Index" std::cout << std::left << std::setw(8) << "Index"
<< std::left << std::setw(5) << "ID" << 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) << "Total Amount"
<< std::left << std::setw(15) << "Status" << std::left << std::setw(15) << "Status"
<< "\n"; << "\n";
for (auto& order : customerOrders) for (auto& order : userOrders)
{ {
std::cout << std::left << std::setw(8) << orderIndex std::cout << std::left << std::setw(8) << orderIndex
<< std::left << std::setw(5) << order.second->getId() << 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) << order.second->getTotal()
<< std::left << std::setw(15) << getOrderStatusString(order.second->getStatus()) << std::left << std::setw(15) << getOrderStatusString(order.second->getStatus())
<< "\n"; << "\n";
@@ -152,11 +152,11 @@ static orders::iterator pickOrderFromOrders(orders& customerOrders)
std::cout << "\nSelect Index: "; std::cout << "\nSelect Index: ";
util::readValue<int>(orderChoiceIndex); util::readValue<int>(orderChoiceIndex);
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); std::advance(orderIterator, orderChoiceIndex);
return orderIterator; 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() << std::left << std::setw(10) << menuItem.getPrice() * item->getQuantity()
<< "\n"; << "\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"; std::cout << "Status : " << getOrderStatusString(orderIterator->second->getStatus()) << "\n";
} }
else if (!customerOrders.empty()) else if (!customerOrders.empty())
@@ -626,7 +626,7 @@ void FoodDeliveryController::placeOrder()
{ {
if (!order) if (!order)
{ {
order = std::make_shared<Order>(); order = std::make_shared<Order>(customer->getName());
} }
order->addItem(Item(*(menuItemIterator->second), quantity)); order->addItem(Item(*(menuItemIterator->second), quantity));
std::cout << menuItemIterator->second->getName() << " with quantity " << quantity << " has been added to your Order\n"; 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()) if (orderIterator != customerOrders.end())
{ {
OrderStatus orderStatus = orderIterator->second->getStatus(); OrderStatus orderStatus = orderIterator->second->getStatus();
if (orderStatus != OrderStatus::CANCELLED && orderStatus != OrderStatus::DELIVERED) { if (orderStatus == OrderStatus::CREATED)
{
orderIterator->second->setStatus(OrderStatus::CANCELLED); orderIterator->second->setStatus(OrderStatus::CANCELLED);
std::cout << "Order " << orderIterator->second->getId() << " has been cancelled successfully!\n"; 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 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()) else if (!customerOrders.empty())
@@ -35,7 +35,7 @@ public:
void listRestaurants() const; void listRestaurants() const;
void addNewRestaurant(); void addNewRestaurant();
void updateRestaurantStatus() const; void updateRestaurantStatus() const;
void listRestaurantOrders(); void listRestaurantOrders() const;
void markOrderReady(); void markOrderReady();
void listMenuItems() const; void listMenuItems() const;
void addMenuItem() const; void addMenuItem() const;
@@ -36,3 +36,8 @@ void Order::setStatus(const OrderStatus& orderStatus)
{ {
m_status = orderStatus; m_status = orderStatus;
} }
const std::string& Order::getCustomerUsername()
{
return m_customerUsername;
}
@@ -5,6 +5,7 @@ Date: 18-12-2026
#pragma once #pragma once
#include <vector> #include <vector>
#include <string>
#include <memory> #include <memory>
#include "Item.h" #include "Item.h"
@@ -27,11 +28,13 @@ private:
items m_items; items m_items;
double m_totalAmount; double m_totalAmount;
OrderStatus m_status; OrderStatus m_status;
std::string m_customerUsername;
public: public:
Order(): Order(const std::string& customerUsername) :
m_id(++m_uid), m_id(++m_uid),
m_totalAmount(0), m_totalAmount(0),
m_status(OrderStatus::CREATED) m_status(OrderStatus::CREATED),
m_customerUsername(customerUsername)
{} {}
int getId() const; int getId() const;
void addItem(const Item&); void addItem(const Item&);
@@ -39,5 +42,6 @@ public:
double getTotal() const; double getTotal() const;
OrderStatus getStatus() const; OrderStatus getStatus() const;
void setStatus(const OrderStatus&); void setStatus(const OrderStatus&);
const std::string& getCustomerUsername();
}; };
@@ -35,6 +35,14 @@ orders& Restaurant::getOrders()
return m_orders; 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 bool Restaurant::getStatus() const
{ {
return m_isOpen; return m_isOpen;
@@ -38,6 +38,7 @@ public:
menuItems& getMenuItems(); menuItems& getMenuItems();
const std::string& getName() const; const std::string& getName() const;
orders& getOrders(); orders& getOrders();
void addOrder(std::shared_ptr<Order>);
bool getStatus() const; bool getStatus() const;
void setStatus(bool); void setStatus(bool);
}; };
@@ -24,7 +24,7 @@ void RestaurantOwnerMenu::showMenu()
"2. Add New Restaurant\n" "2. Add New Restaurant\n"
"3. Update Restaurant Status\n" "3. Update Restaurant Status\n"
"4. List Orders\n" "4. List Orders\n"
"5. Mark Order Ready for Delivery\n" "5. Mark Order Ready for PickUp\n"
"6. List Menu Items\n" "6. List Menu Items\n"
"7. Add New Item to Menu\n" "7. Add New Item to Menu\n"
"8. Remove Item from Menu\n" "8. Remove Item from Menu\n"